После того, как первый фрагмент заменен вторым, Как открыть навигационный ящик

#java #android #android-fragments #fragment #navigation-drawer

Вопрос:

Я создал проект навигационного ящика Android Studio по умолчанию. По умолчанию у меня есть одно действие и три основных фрагмента. (Главная страница, Галерея, Слайд-шоу), я пытаюсь только с домашним фрагментом. Я заменил < фрагмент > из XML-файла content_main на

 <androidx.fragment.app.FragmentContainerView
    android:id="@ id/nav_host_fragment_content_main"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:defaultNavHost="true"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:navGraph="@navigation/mobile_navigation" /> 
 

и изменил основную активность следующим образом

 //inside onCreate
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_content_main);

    NavController navController;
    if (navHostFragment != null) {
        navController = navHostFragment.getNavController();
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
    } else {
        Log.e("Error", "Failed on NULL NavController");
    }
 

//и изменил следующее

 @Override
public boolean onSupportNavigateUp() {
    NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_content_main);
    assert navHostFragment != null;
    return NavigationUI.navigateUp(navHostFragment.getNavController(), mAppBarConfiguration)
            || super.onSupportNavigateUp();
}
 

Затем я создал один пустой фрагмент.
На домашнем фрагменте у меня есть кнопка и OnClickListener для замены домашнего фрагмента на пустой фрагмент, как

 binding.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.d("onClick: ", "Clicked");
            BlankFragment blankFragment = new BlankFragment();
            requireActivity().getSupportFragmentManager().beginTransaction()
                    .replace(R.id.nav_host_fragment_content_main, blankFragment, null)
                    .addToBackStack("blank").commit();
        }
    });
 

Теперь после нажатия на кнопку фрагмент заменяется пустым фрагментом, но оттуда, если я попытаюсь открыть панель навигации, я получу следующую ошибку для первой строки вышеупомянутой функции onSupportNavigateUp() :

 java.lang.ClassCastException: BlankFragment cannot be cast to androidx.navigation.fragment.NavHostFragment
 

Как это решить. заранее спасибо.

Комментарии:

1. При использовании компонентов навигации не следует выполнять транзакцию фрагментов вручную .. Сделайте это с помощью навигационного контроллера

2. Спасибо, постараюсь это сделать. Но не уверен, что это лучший способ, Попробовал следующее, и, похоже, это работает, публикуя для других. learntodroid.com/…

Ответ №1:

Как предложил Зейн в комментарии, я попытался использовать NavController. Попробовал следующее, и, похоже, это работает, публикуя для других. https://learntodroid.com/how-to-move-between-fragments-using-the-navigation-component/