第一个片段替换为第二个片段后,如何打开导航抽屉

Posted

技术标签:

【中文标题】第一个片段替换为第二个片段后,如何打开导航抽屉【英文标题】:After first fragment replaced by the second, How to open the navigation drawer 【发布时间】:2021-11-30 19:55:34 【问题描述】:

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

<androidx.fragment.app.FragmentContainerView
    android:id="@+id/nav_host_fragment_content_main"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_
    android:layout_
    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。 在主页 Fragment 上,我有一个按钮和 onClickListener 将 HomeFragment 替换为 BlankFragment 为

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

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

【问题讨论】:

您在使用导航组件时不应该手动进行片段事务。使用 navController 执行此操作 谢谢,会尝试这样做。但不确定什么是最好的方法,尝试了以下方法,它似乎有效,为他人发帖。 learntodroid.com/… 【参考方案1】:

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

【讨论】:

以上是关于第一个片段替换为第二个片段后,如何打开导航抽屉的主要内容,如果未能解决你的问题,请参考以下文章

想要使用片段从导航抽屉活动移动到另一个屏幕,以在所有屏幕上显示抽屉

如何打开关闭应用程序后打开的最后一个片段并使用导航抽屉和导航组件重新打开它

如何在主片段中单击按钮时打开导航抽屉?

如何在导航抽屉中的两个片段之间传递数据

Android如何使用工具栏中的按钮切换以使用片段打开/关闭导航抽屉

导航抽屉backstack,如何让actionbar标题在点击后随片段改变