Навигация между фрагментами с использованием BottomNavigationView - PullRequest
0 голосов
/ 16 апреля 2020

Там есть 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>

Я не знаю, что не так (особенно с первым решением) любой идея? Спасибо.

1 Ответ

0 голосов
/ 27 апреля 2020

Наконец-то я решил свою проблему:

Работает нормально, когда я открываю фрагмент из меню навигации в первый раз, но когда я нажимаю второй раз в меню навигации, 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, я могу корректно перемещаться по вкладкам.

...