首页 > 解决方案 > 如何移动到下一个 NavHostFragment?

问题描述

这应该是一个非常容易解决的问题,但我似乎无法弄清楚。

我正在使用 Jetpack 导航架构组件,尽管导航到具有在布局中不同导航主机中指定的不同导航图的不同活动,但我无法更改正在使用的导航图。

在我的应用程序中,我有 2 个活动;MainActivity.ktPartyActivity.kt。它们每个都是 a 的容器,FragmentContainerView它是NavHostFragmentNavGraph(pre_login_nav_graph.xmllogged_in_nav_graph.xml分别)仅在每个活动的上下文中使用的容器。和 的导航都按预期工作MainActivitypre_login_nav_graph但是当我导航到PartyActivity并完成MainActivity时,设置新的导航主机时,它不会显示正确的开始目的地logged_in_nav_graph,而是显示 的开始目的地pre_login_nav_graph

让我更加困惑的是,当我记录导航控制器的 currentDestination 是什么时,它声称它位于正确的起始目的地,logged_in_nav_graph即使它明显不是!除非由于某种原因片段布局不可见,否则我想不出显示与导航控制器告诉我的内容之间存在这种脱节的原因。

派对活动.kt

class PartyActivity : AppCompatActivity() {

    private lateinit var binding: ActivityPartyBinding

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

        binding = DataBindingUtil.setContentView(this, R.layout.activity_party)
        setupBottomNavBinding()

        // set search as first active tab
        binding.bottomNav.selectedItemId = R.id.searchFragment
    }

    override fun onStart() {
        super.onStart()
        findNavController(R.id.party_nav_host_fragment).navigate(R.id.partyCodeFragment)
        Timber.e("${findNavController(R.id.party_nav_host_fragment).currentDestination}")
        // ^ this logs the expected correct current dest but that fragment isn't shown on screen 
    }

    private fun setupBottomNavBinding() {
        binding.bottomNav.setOnNavigationItemSelectedListener { item ->
            when(item.itemId) {
                R.id.searchFragment,
                R.id.queueFragment,
                R.id.nowPlayingFragment -> {
                    true
//                    NavigationUI
//                        .onNavDestinationSelected(item, party_nav_host_fragment.findNavController())
                }
                else -> {
                    Timber.e("Bottom Nav selection ${item.title} not recognized")
                    false
                }
            }
        }
    }
}

活动派对.xml

<?xml version="1.0" encoding="utf-8"?>
<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">
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".ui.partyActivity.PartyActivity">

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/party_nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="0dp"
            android:layout_height="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="@navigation/logged_in_nav_graph" />

        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottom_nav"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            app:labelVisibilityMode="selected"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:menu="@menu/bottom_navigation" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

登录的_in_nav_graph.xml

<?xml version="1.0" encoding="utf-8"?>
<navigation 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/logged_in_nav_graph"
    app:startDestination="@id/partyCodeFragment">

    <fragment
        android:id="@+id/partyCodeFragment"
        android:name="com.niehusst.partyq.ui.partyCode.PartyCodeFragment"
        android:label="PartyCodeFragment"
        tools:layout="@layout/party_code_fragment" />
</navigation>

party_code_fragment.xml(的预期起始目的地logged_in_nav_graph.xml

<?xml version="1.0" encoding="utf-8"?>
<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">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:background="@color/black"
        tools:context=".ui.partyCode.PartyCodeFragment">

        <!-- TODO: Update blank fragment layout -->
        <TextView
            android:id="@+id/temp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/white"
            android:text="Party code" />

    </LinearLayout>
</layout>

如果您想挖掘其他文件,完整的代码库已在github上打开。

标签: androidandroid-fragmentsandroid-architecture-navigationandroid-navigationandroid-jetpack-navigation

解决方案


问题原来是一个错字:(在我的片段PartyCodeFragment中,我不小心尝试使用PartyConnectFragmentBinding来膨胀布局。当自动完成出错时......


推荐阅读