android-fragments 未使用DrawerLayout和BottomNavigationView导航回上一个片段

brgchamk  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(201)

我遇到了这样的问题:当我从一个片段向后导航时,它不会将我带回到我的BottomNavigation中先前选择的片段。
我有一个同时包含DrawerLayoutBottomNavigation的MainActivity。BottomNavigation中有3个项目,对应于3个片段(Home、Readings、Graph)。所有3个都是应用中的顶级目的地(所有3个都有汉堡菜单图标)。DrawerLayout中有1个项目,用于打开我的AboutFragment。
在底部导航的阅读页面中,我打开抽屉布局并单击“关于”,这将打开AboutFragment。然后,当我单击AboutFragment中的“向上”箭头时,它并没有将我带回阅读页面,而是将我带回主页(底部导航的第一项)。我如何才能使它返回阅读页面,这是我之前所在的页面?

主要活动

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();
    }

}

导航图形.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中的“向上”箭头时,它确实会将我带回Readings。通过DrawerLayout访问AboutFragment的行为似乎与从FAB访问AboutFragment的行为不同。

gywdnpxw

gywdnpxw1#

您是否可以尝试:

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

让我知道它是否适合你

cgh8pdjw

cgh8pdjw2#

在这里为其他有这个问题的人回答我自己的问题。解决方案是将android:menuCategory="secondary"放在DrawerLayout菜单文件的AboutFragment项中。

菜单_抽屉.xml

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

原因是:

  • 默认情况下,返回堆栈将弹出到导航图的起始目标。具有android:menuCategory=“secondary”的菜单项将不会弹出返回堆栈。*

我在这篇文章中找到了解决方案https://stackoverflow.com/a/60516769/728002

相关问题