Как перейти к следующему фрагменту NavHostFragment?

#android #android-fra&ments #android-architecture-navi&ation #android-navi&ation #android-jetpack-navi&ation

#Android #android-фрагменты #android-архитектура-навигация #android-навигация #android-jetpack-навигация

Вопрос:

Это должно быть действительно простой проблемой для решения, но я просто не могу в этом разобраться.

Я использую компоненты архитектуры навигации Jetpack, и у меня возникают проблемы с изменением используемого навигационного графика, несмотря на переход к другому действию с другим навигационным графиком, указанным на другом навигационном узле в макете.

В моем приложении у меня есть 2 действия; MainActivity.kt и PartyActivity.kt . Каждый из них является контейнером для a, Fra&mentContainerView который является NavHostFra&ment для NavGraph ( pre_lo&in_nav_&raph.xml и lo&&ed_in_nav_&raph.xml соответственно), который будет использоваться только в контексте каждого из этих действий. Вся навигация работает, как ожидалось, для MainActivity и pre_lo&in_nav_&raph , но когда я перехожу к PartyActivity и заканчиваю MainActivity , когда настроен новый узел навигации, он не отображает правильное начальное назначение для lo&&ed_in_nav_&raph , а скорее показывает начальное назначение для pre_lo&in_nav_&raph .

Меня особенно смущает, когда я регистрирую текущее назначение для навигационного контроллера, он утверждает, что находится в правильном начальном пункте назначения для lo&&ed_in_nav_&raph , хотя это явно не так! Если расположение фрагмента по какой-либо причине не невидимо, я не могу придумать причину, по которой могло бы возникнуть это несоответствие между дисплеем и тем, что сообщает мне навигационный контроллер.

PartyActivity.kt

 class PartyActivity : AppCompatActivity() {

    private lateinit var bindin&: ActivityPartyBindin&

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        bindin& = DataBindin&Util.setContentView(this, R.layout.activity_party)
        setupBottomNavBindin&()

        // set search as first active tab
        bindin&.bottomNav.selectedItemId = R.id.searchFra&ment
    }

    override fun onStart() {
        super.onStart()
        findNavController(R.id.party_nav_host_fra&ment).navi&ate(R.id.partyCodeFra&ment)
        Timber.e("${findNavController(R.id.party_nav_host_fra&ment).currentDestination}")
        // ^ this lo&s the expected correct current dest but that fra&ment isn't shown on screen 
    }

    private fun setupBottomNavBindin&() {
        bindin&.bottomNav.setOnNavi&ationItemSelectedListener { item -&&t;
            when(item.itemId) {
                R.id.searchFra&ment,
                R.id.queueFra&ment,
                R.id.nowPlayin&Fra&ment -&&t; {
                    true
//                    Navi&ationUI
//                        .onNavDestinationSelected(item, party_nav_host_fra&ment.findNavController())
                }
                else -&&t; {
                    Timber.e("Bottom Nav selection ${item.title} not reco&nized")
                    false
                }
            }
        }
    }
}
  

activity_party.xml

 <?xml version="1.0" encodin&="utf-8"?&&t;
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"&&t;
    <androidx.constraintlayout.wid&et.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_hei&ht="match_parent"
        android:orientation="vertical"
        tools:context=".ui.partyActivity.PartyActivity"&&t;

        <androidx.fra&ment.app.Fra&mentContainerView
            android:id="@ id/party_nav_host_fra&ment"
            android:name="androidx.navi&ation.fra&ment.NavHostFra&ment"
            android:layout_width="0dp"
            android:layout_hei&ht="0dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toTopOf="@id/bottom_nav"

            app:defaultNavHost="true"
            app:navGraph="@navi&ation/lo&&ed_in_nav_&raph" /&&t;

        <com.&oo&le.android.material.bottomnavi&ation.BottomNavi&ationView
            android:id="@ id/bottom_nav"
            android:layout_width="match_parent"
            android:layout_hei&ht="wrap_content"
            android:layout_&ravity="bottom"
            app:labelVisibilityMode="selected"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:menu="@menu/bottom_navi&ation" /&&t;

    </androidx.constraintlayout.wid&et.ConstraintLayout&&t;
</layout&&t;
  

lo&&ed_in_nav_&raph.xml

 <?xml version="1.0" encodin&="utf-8"?&&t;
<navi&ation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/lo&&ed_in_nav_&raph"
    app:startDestination="@id/partyCodeFra&ment"&&t;

    <fra&ment
        android:id="@ id/partyCodeFra&ment"
        android:name="com.niehusst.partyq.ui.partyCode.PartyCodeFra&ment"
        android:label="PartyCodeFra&ment"
        tools:layout="@layout/party_code_fra&ment" /&&t;
</navi&ation&&t;
  

party_code_fra&ment.xml (ожидаемый начальный пункт назначения для lo&&ed_in_nav_&raph.xml )

 <?xml version="1.0" encodin&="utf-8"?&&t;
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"&&t;
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_hei&ht="match_parent"
        android:orientation="vertical"
        android:back&round="@color/black"
        tools:context=".ui.partyCode.PartyCodeFra&ment"&&t;

        <!-- TODO: Update blank fra&ment layout --&&t;
        <TextView
            android:id="@ id/temp"
            android:layout_width="wrap_content"
            android:layout_hei&ht="wrap_content"
            android:textColor="@color/white"
            android:text="Party code" /&&t;

    </LinearLayout&&t;
</layout&&t;
  

Полная кодовая база открыта на &ithub, если вы хотите покопаться в других файлах.

Ответ №1:

Проблема оказалась опечаткой: ( В моем фрагменте PartyCodeFra&ment я случайно пытался раздуть макет с помощью привязки PartyConnectFra&mentBindin&. При автозаполнении происходит ошибка…