不使用 DrawerLayout 和 BottomNavigationView 导航回上一个片段
Not navigating back to previous fragment with DrawerLayout and BottomNavigationView
我遇到的问题是,当我从一个片段导航回来时,它没有带我回到之前在我的 BottomNavigation 中选择的片段。
我有一个 MainActivity,它同时具有 DrawerLayout 和 BottomNavigation。 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
中找到了解决方案
我遇到的问题是,当我从一个片段导航回来时,它没有带我回到之前在我的 BottomNavigation 中选择的片段。
我有一个 MainActivity,它同时具有 DrawerLayout 和 BottomNavigation。 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