Там есть NavigationView
, который открывает фрагмент, в этом фрагменте есть BottomNavigationView
. Нижний навигационный экран должен переключаться между двумя фрагментами.
Примечание. При запуске приложения открывается первый фрагмент blank (называемый 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
больше не срабатывает, и я не могу переключиться с фрагмента на другой.
Итак, я попытался выполнить sh мою цель, используя 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>
Я не знаю, что не так (особенно с первым решением) любой идея? Спасибо.