当前位置: 首页 > 知识库问答 >
问题:

Android导航架构组件:使用NavigationView的错误BackStack

高德水
2023-03-14

我使用Android导航架构组件来导航一个基于片段的单活动应用程序。主导航通过NavigationDrawer模式实现:带有NavigationView和NavHostFragment plus的DrawerLayout以及附加工具栏。

到目前为止,一切都运行良好——我能够导航到每个片段——除了主级片段的BackStack。除了开始目的地之外的任何片段似乎都被添加到BackStack中,而不是像普通的NavigationDrawer那样被替换。

只要我导航到startDestination以外的片段,就可以通过汉堡包图标切换到Back图标来识别错误行为,也可以通过导航到startDestination而不是退出应用程序来识别错误行为。

应该如何使用导航架构组件来替换与NavigationView组合的主要片段?

我正在初始化导航架构组件,如下所示:

class MainActivity : AppCompatActivity {

    private val navigationHostFragment: NavHostFragment
        get() = supportFragmentManager.findFragmentById(R.id.navigationHost) as NavHostFragment

    private val navigationController: NavController
        get() = navigationHostFragment.navController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity)

        // Views are bound via Kotlin Android Extensions
        setSupportActionBar(toolbar)
        NavigationUI.setupWithNavController(toolbar, navigationController, drawerLayout)
        NavigationUI.setupWithNavController(navigationView, navigationController)
    }

    override fun onSupportNavigateUp(): Boolean = findNavController(R.id.navigationHost).navigateUp()
}

活动的布局(/res/layout/activity.xml)如下所示:

<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"/>

        <fragment
            android:id="@+id/navigationHost"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:navGraph="@navigation/navigation"
            app:defaultNavHost="true"/>

    </LinearLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigationView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/navigation"/>

</androidx.drawerlayout.widget.DrawerLayout>

导航图(/res/navigation/navigation.xml)如下所示:

<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"
    app:startDestination="@id/first">

    <fragment
        android:id="@+id/first"
        android:name="de.example.FirstFragment"
        android:label="@string/first"/>

    <fragment
        android:id="@+id/second"
        android:name="de.example.SecondFragment"
        android:label="@string/second"/>

</navigation>

NavigationView(/res/菜单/navigation.xml)的菜单如下所示:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">

        <item
            android:id="@+id/first"
            android:title="@string/first"/>

        <item
            android:id="@+id/second"
            android:title="@string/second"/>

    </group>

</menu>

相关的依赖项如下所示:

dependencies {
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.core:core-ktx:1.0.0'
    implementation 'android.arch.navigation:navigation-fragment-ktx:1.0.0-alpha06'
    implementation 'android.arch.navigation:navigation-ui-ktx:1.0.0-alpha06'
}

共有1个答案

锺离霖
2023-03-14

正如Alex所说,我最初的目标与导航原则相冲突:

应用程序有一个固定的目标,即用户从启动器启动应用程序时看到的屏幕。该目标也应该是用户按下后退按钮后返回启动器时看到的最后一个屏幕。

 类似资料:
  • 我目前正在学习新的Android导航架构组件 (https://developer.android.com/topic/libraries/architecture/navigation/). 我有点混淆了它的动机和概念,以下是我的不确定性: Android导航架构组件是否旨在消除在单个应用程序中使用多个活动的需要?这意味着,整个应用程序只需要一个单一活动,所有其他页面都将是片段? 在应用程序中使

  • 我一直在遵循导航架构组件中的文档,以了解这个新的导航系统是如何工作的。 要从一个屏幕到另一个屏幕进行/返回,您需要一个实现接口的组件。 NavHost是一个空视图,当用户在应用程序中导航时,目的地会随之交换。 但是,似乎目前只有片段实现了< code>NavHost 导航架构组件的默认NavHost实现是NavHostFragment。 所以,我的问题是: > < li> 即使我有一个可以用< c

  • 我不知道如何使用新的导航架构组件,从我的主屏幕(带有连接到底部应用程序栏的浮动操作按钮)导航到没有应用程序栏的另一个屏幕。 当我点击晶圆厂时,我想要我的下一个屏幕(片段?)从右侧滑入。问题是我应该把我的

  • 我正在我的应用程序中尝试导航架构组件。早些时候,我使用片段事务来实现以下功能。基本上,我想从导航。 碎片- 如果我正在使用导航组件并尝试 然后结果是FragmentA被FragmentB替换并且背景片段不可见。 我想知道一个解决方案,如果导航架构组件允许的话。 附言:我听说过嵌套导航主机,但从内部使用它好吗。 更新: FragmentB将有进一步交易的行动,例如: 碎片- 当用户按下后退按钮时,片

  • 我正在一个新的Android应用程序上使用导航组件,但我不知道怎么做 首先,我有我的主活动,我有main_navigation_graph 主要活动 NavHostFragment main_navigation_graph里面有3个碎片 这里一切都很好。问题是当我到达最后一个片段时,因为在这个片段上,我想根据BottomNavigationView输入(暂时)显示一些子片段(在新的NavHost

  • 是否可以将新的导航架构组件与DialogFragment一起使用?我必须创建自定义导航器吗? 我很乐意将它们与导航图中的新功能结合使用。