不使用 DrawerLayout 和 BottomNavigationView 导航回上一个片段

Not navigating back to previous fragment with DrawerLayout and BottomNavigationView

我遇到的问题是,当我从一个片段导航回来时,它没有带我回到之前在我的 BottomNavigation 中选择的片段。

我有一个 MainActivity,它同时具有 DrawerLayoutBottomNavigation。 BottomNavigation 中有 3 个项目,对应于 3 个片段(Home、Readings、Graph)。所有 3 个都是应用程序中的顶级目的地(所有 3 个都有汉堡菜单图标)。 DrawerLayout 中有 1 个项目可以打开我的 AboutFragment。

在底部导航的阅读页面中,我打开抽屉布局并单击关于打开 AboutFragment。然后,当我单击 AboutFragment 中的 'up' 箭头时,它不会将我带回 Readings,而是将我带回主页(底部导航中的第一项)。我怎样才能让它返回到我之前所在的页面 Readings?

MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mBinding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(mBinding.getRoot());
        setSupportActionBar(mBinding.appBarMain.mainToolbar);

        mBottomNav = mBinding.appBarMain.mainBottomBar;
        mDrawerLayout = mBinding.drawerLayout;

        NavigationView navigationView = mBinding.navView;
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.home, R.id.readings, R.id.graph)
                .setOpenableLayout(mDrawerLayout)
                .build();

        NavController navController = Navigation.findNavController(this, R.id.main_fragments_container);   
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
        NavigationUI.setupWithNavController(mBottomNav, navController);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        NavController navController = Navigation.findNavController(this, R.id.main_fragments_container);
        return NavigationUI.onNavDestinationSelected(item, navController)
                || super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.main_fragments_container);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration) || super.onSupportNavigateUp();
    }

}

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

    <fragment
        android:id="@+id/home"
        android:name="com.myapp.ui.tabs.HomeFragment"
        android:label="@string/menu_title_home"
        tools:layout="@layout/fragment_home" />

    <fragment
        android:id="@+id/readings"
        android:name="com.myapp.ui.tabs.ReadingsFragment"
        android:label="@string/menu_title_readings"
        tools:layout="@layout/fragment_readings" />

    <fragment
        android:id="@+id/graph"
        android:name="com.myapp.ui.tabs.GraphFragment"
        android:label="@string/menu_title_graph"
        tools:layout="@layout/fragment_graph" />

    <fragment
        android:id="@+id/about"
        android:name="com.myapp.ui.about.AboutFragment"
        android:label="@string/general_about"
        tools:layout="@layout/fragment_about" />

</navigation>

注意 作为测试,如果我将 FAB 按钮(在所有 BottomNavigation 片段屏幕上可见)转到 AboutFragment,然后当我单击 AboutFragment 中的 'up' 箭头时,它确实会将我带回 Readings。似乎通过 DrawerLayout 访问 AboutFragment 与从 FAB 访问 AboutFragment 的行为不同。

你能不能试试:

override fun onSupportNavigateUp(): Boolean {
        val navController = this.findNavController(R.id.mainNavHostFragment)
        return when(navController.currentDestination?.id) {
            R.id.about-> {
                popBackStack()
                true
            }
            else -> navController.navigateUp()
        }
}

让我知道它是否适合你

在这里为遇到此问题的其他人回答我自己的问题。解决办法是在DrawerLayout菜单文件的AboutFragment项中放入android:menuCategory="secondary"

menu_drawer.xml

<item
     android:id="@+id/nav_about"
     android:menuCategory="secondary"
     android:icon="@drawable/vic_about"
     android:title="@string/general_about" />

这样做的原因是:

默认情况下,返回堆栈将弹出回到导航图的起始目的地。 android:menuCategory="secondary" 的菜单项不会弹出返回堆栈。

我在这个 post

中找到了解决方案