首页 > 解决方案 > 第一个片段替换为第二个片段后,如何打开导航抽屉

问题描述

我已经创建了默认的 Android Studio Navigation Drawer 项目。默认情况下,我有一个活动和三个主要片段。(首页、画廊、幻灯片),我只尝试使用首页片段。我已将 content_main XML 中的 < 片段 > 替换为

<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" /> 

并将 MainActivity 修改为

//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();
}

接下来,我创建了一个 BlankFragment。在 home Fragment 上,我有一个按钮和 onClickListener 用 BlankFragment 替换 HomeFragment 作为

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

如何解决这个问题。提前致谢。

标签: javaandroidandroid-fragmentsfragmentnavigation-drawer

解决方案


正如 Zain 在评论中所建议的那样,我尝试使用 navController。尝试了以下,它似乎工作,为他人发帖。 https://learntodroid.com/how-to-move-between-fragments-using-the-navigation-component/


推荐阅读