[英]Navigation between fragments using BottomNavigationView
有一个NavigationView
打开一个片段,在那个片段中有一个BottomNavigationView
。 底部导航视图,应该在两个片段之间切换。
注意:当应用程序启动时,它会打开第一个空白片段(称为Home
),因此当我单击第二个菜单项时,它会打开另一个片段(包含底部导航)。
我尝试以这种方式使用FragmentTransaction
从一个片段切换到另一个片段:
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
fragmentManager.popBackStack();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
final Fragment fragment;
if (item.getItemId() == R.id.menu_alert) {
fragment = new IPAlertFragment();
} else {
fragment = new IPStatsFragment();
}
fragmentTransaction.replace(R.id.nav_host_fragment, fragment).commit();
return false;
}
};
BottomNavigationView navigation = (BottomNavigationView) getActivity().findViewById(R.id.bottom_navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
}
当我第一次从导航菜单打开片段时它工作正常,但是当我在导航菜单上第二次单击时, BottomNavigationView.onNavigationItemSelectedListener
不再触发,我无法从一个片段切换到另一个.
因此,我尝试使用NavController
来实现我的目标,如下所示:
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
final NavController navController = NavHostFragment.findNavController(NavFragment.this);
if (item.getItemId() == R.id.menu_alert) {
navController.navigate(R.id.action_openAlert);
} else {
navController.navigate(R.id.action_openStats);
}
return false;
}
};
BottomNavigationView navigation = (BottomNavigationView) getActivity().findViewById(R.id.bottom_navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
}
但是当我导航到另一个片段时,左侧菜单栏将图标更改为“后退箭头”,这是一种新活动,我必须使用后退按钮(或菜单后退图标)才能显示上一个选项卡.
我想导航到覆盖当前“屏幕”的目标片段,就像侧面菜单一样。
这是mobile_navigation.xml
:
<fragment
android:id="@+id/nav_ip_alert"
android:name="IPAlertFragment"
android:label="@string/menu_ip"
tools:layout="@layout/fragment_i_p_alert">
<action
android:id="@+id/action_openStats"
app:destination="@id/nav_ip_stats"
app:launchSingleTop="false" />
</fragment>
<fragment
android:id="@+id/nav_ip_stats"
android:name="IPStatsFragment"
android:label="@string/menu_ip"
tools:layout="@layout/stats_tabs">
<action
android:id="@+id/action_openAlert"
app:destination="@id/nav_ip_alert"
app:launchSingleTop="false" />
</fragment>
我不知道出了什么问题(尤其是第一个解决方案)有什么想法吗? 谢谢。
最后我解决了我的问题:
当我第一次从导航菜单打开片段时它工作正常,但是当我在导航菜单上第二次单击时,BottomNavigationView.onNavigationItemSelectedListener 不再触发,我无法从一个片段切换到另一个.
问题是由导航菜单引起的,因为我在活动中使用了监听器,所以没有调用监听器:
NavigationUI.setupWithNavController(navigationView, navController);
这会覆盖我的OnNavigationItemSelectedListener
,因此我删除了该行,并将我的侦听器设置如下:
final NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(new
NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
FragmentManager fm = getSupportFragmentManager();
fm.popBackStackImmediate();
boolean handled = NavigationUI.onNavDestinationSelected(item, navController);
if (handled) {
ViewParent parent = navigationView.getParent();
if (parent instanceof DrawerLayout) {
((DrawerLayout) parent).closeDrawer(navigationView);
}
}
return handled;
}
});
这是一个覆盖我的侦听器的 NavigationUI:
public static void setupWithNavController(@NonNull final NavigationView navigationView,
@NonNull final NavController navController) {
navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
boolean handled = onNavDestinationSelected(item, navController);
//******* CUTTED ***************
return handled;
}
});
}
因此,替换setupWithNavController
,我可以正确浏览选项卡。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.