ジェットパックナビゲーションを使用して下部ナビゲーション設定にカスタムトランジションアニメーションを追加する 質問する

ジェットパックナビゲーションを使用して下部ナビゲーション設定にカスタムトランジションアニメーションを追加する 質問する

私はジェットパックコンポーネントを使ったアプリを開発中です。ガイドただし、対応するナビゲーション ボタンを押してフラグメントを切り替えるときの遷移アニメーションを変更する方法がわかりません。

私の知る限り、トランジションを作成するには 2 つの方法があります。

  • navigate()この場合は明示的に呼び出されていない のオプションとして渡します。
  • アニメーション属性を持つアクションを使用していますが、ナビゲーションにこれらのアクションを使用するように指示する方法がわかりません。特定の ID を指定すると機能するでしょうか?

では、使用を諦めずにカスタムトランジションアニメーションを設定するにはどうすればいいのでしょうか?BottomNavigation.setupWithNavController(navController)

ベストアンサー1

できないと思いますが、解決策には興味があります。

役に立つかもしれない回避策は次のとおりです:

下部ナビゲーションをナビゲーション コントローラーに結び付けないでください (ガイドに示されていることを行わないでください)。次のようにハンドラーを設定して、遷移を自分で管理します。

    bottomNav!!.setOnNavigationItemSelectedListener { item ->
        selectFragment(item)
        false
    }

次に、各フラグメント間の遷移を作成し、ハンドラーで自分で管理します。以下は 3 の例です。

private fun selectFragment(item: MenuItem) {
    if (selectedItem == -1)
        navController.navigate(item.itemId)
    else
        navController.navigate(
                when (item.itemId) {
                    R.id.interviewsFragment ->
                        if (selectedItem == R.id.personsFragment)
                            R.id.action_personsFragment_to_interviewsFragment
                        else
                            R.id.action_questionListsFragment_to_interviewsFragment
                    R.id.personsFragment ->
                        if (selectedItem == R.id.interviewsFragment)
                            R.id.action_interviewsFragment_to_personsFragment
                        else
                            R.id.action_questionListsFragment_to_personsFragment
                    R.id.questionListsFragment ->
                        if (selectedItem == R.id.interviewsFragment)
                            R.id.action_interviewsFragment_to_questionListsFragment
                        else
                            R.id.action_personsFragment_to_questionListsFragment
                    else -> item.itemId
                })

    selectedItem = item.itemId


    // uncheck the other items.
    for (i in 0 until bottomNav!!.menu.size()) {
        val menuItem = bottomNav!!.menu.getItem(i)
        if (menuItem.itemId == item.itemId) menuItem.isChecked = true
    }
}

ナビゲーション マップでアニメーションを定義します。次の図は 3 つのフラグメントの例です。アニメーションは選択された項目に向かって移動し、自然な感じになります。

<fragment
    android:id="@+id/interviewsFragment"
    android:name="com.unludo.interview.interview.list.InterviewsFragment"
    android:label="InterviewsFragment" >
    <action
        android:id="@+id/action_interviewsFragment_to_personsFragment"
        app:destination="@id/personsFragment"
        app:enterAnim="@anim/enter_from_right"
        app:exitAnim="@anim/exit_to_left" />
    <action
        android:id="@+id/action_interviewsFragment_to_questionListsFragment"
        app:destination="@id/questionListsFragment"
        app:enterAnim="@anim/enter_from_right"
        app:exitAnim="@anim/exit_to_left" />
</fragment>
<fragment
    android:id="@+id/personsFragment"
    android:name="com.unludo.interview.persons.list.PersonsFragment"
    android:label="PersonsFragment" >
    <action
        android:id="@+id/action_personsFragment_to_interviewsFragment"
        app:destination="@id/interviewsFragment"
        app:enterAnim="@anim/enter_from_left"
        app:exitAnim="@anim/exit_to_right" />
    <action
        android:id="@+id/action_personsFragment_to_questionListsFragment"
        app:destination="@id/questionListsFragment"
        app:enterAnim="@anim/enter_from_right"
        app:exitAnim="@anim/exit_to_left" />
</fragment>
<fragment
    android:id="@+id/questionListsFragment"
    android:name="com.unludo.interview.questions.lists.QuestionListsFragment"
    android:label="QuestionListsFragment" >
    <action
        android:id="@+id/action_questionListsFragment_to_personsFragment"
        app:destination="@id/personsFragment"
        app:enterAnim="@anim/enter_from_left"
        app:exitAnim="@anim/exit_to_right" />
    <action
        android:id="@+id/action_questionListsFragment_to_interviewsFragment"
        app:destination="@id/interviewsFragment"
        app:enterAnim="@anim/enter_from_left"
        app:exitAnim="@anim/exit_to_right" />
</fragment>

この動作はコンポーネント自体で管理できると思いますが、現時点では手動で管理する必要があると思います。

乾杯 :)

おすすめ記事