当前位置: 首页 > 知识库问答 >
问题:

当返回到“导航体系结构组件”中的同一选项卡时,嵌套片段的状态将丢失

池砚文
2023-03-14

我正在探索上个月在Google I/O 2018中引入的“导航架构组件”概念。

假设我有一个带有底部导航视图和一个“片段”的活动来承载所有片段:-

<android.support.constraint.ConstraintLayout
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".view.MainActivity">


        <fragment
            android:id="@+id/root_form"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:name="androidx.navigation.fragment.NavHostFragment"
            app:navGraph="@navigation/nav_graph"
            app:defaultNavHost="true"
            />

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/navigation" />

</android.support.constraint.ConstraintLayout>

“我的导航”和“我的导航”将分别在A/B视图中显示“我的碎片”和“我的碎片”选项卡。FragmentB有一个嵌套的(子)片段FragmentC,可以从FragmentB打开。

在我的活动类中,我使用“setupWithNavController()”函数将底部导航视图与导航控制器链接。(包含在“androidx.navigation.ui”包中的Kotlin扩展函数):-

override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)

      bottom_navigation.setupWithNavController(findNavController(R.id.root_form))


 }

一切正常。

但是如果用户在FragmentC中导航到FragmentA,然后再次回到同一个选项卡,那么他将只得到FragmentB而不是碎片C。这是底部导航中的一个常见模式,当用户返回同一个选项卡时,它应该显示他正在查看的最后一个子/嵌套片段。

我知道如果我们有自己的片段事务,我们可以处理这个问题,但是如何在“导航架构组件”领域解决这个问题?

共有1个答案

祁博涛
2023-03-14

您可以使用一个容器片段来保存viewpager,它是来自父级的导航位置。当你在A或B中时,你可以点击C,然后当你返回时,它将返回到父级,这将仍然是你在哪个片段选项卡上。

导航图从不知道碎片A或B,但它知道容器。

 类似资料:
  • 调试错误 E/AndroidRuntime:致命异常:主进程:com.projects.arise.myTestApp,PID:28285 java.lang.RuntimeException:无法启动activity ComponentInfo{com.projects.arise.myTestApp/com.projects.arise.myTestApp.MainActivity}:java

  • 我试图理解在导航选项卡中使用片段时如何保持片段视图状态。在我的努力中,我遇到了两个我找不到合适解决方案的问题。 我有两个选项卡,Tab1和Tab2。Tab1的布局由碎片A定义,Tab2的布局由碎片B定义。我遵循了这里给出的方法(编辑:自从提出这个问题以来,文档已经发生了变化)。 第一个问题:即使我的视图有ID,当片段被重新附加时(在选项卡切换旋转之后),它们的状态也不会完全恢复。特别是:具有ID的

  • 我有一个ViewPagerContainer片段,在应用程序启动时加载。ViewPagerContainer片段将两个选项卡(选项卡A和选项卡B)添加到操作栏。选项卡B有两个项目的列表视图。 我所做的:我在选项卡B片段中的列表视图项上附加了一个click listener,这样当用户单击一个项时,它会在第一个片段(即选项卡B下)内打开另一个片段(子片段)。 我陷入困境的地方:当用户按下后退按钮时,

  • 我正在尝试在我的android应用中实现一个选项卡导航,但是我想在每个选项卡中运行一个不同的activity。我一直在读android开发页面,他们坚持使用片段导航活动。根据我的理解,你不能有一个片段类本身,它必须包含在一个activity中。 是否可以为每个选项卡创建一个新的activity,并在onTabSelected()函数中运行该activity,同时从正在运行的activity中的片段

  • 问题内容: 我实现了带有ViewPager和TabsAdapter的ActionBarSherlock。它运作良好,但是现在我试图从另一个表中的“标签1”中加载的框架中“推送”。 该行为应类似于: 我的应用程序中有3个选项卡,启动时会看到第一个选项卡,其中有一个带有按钮的片段 按下第一个选项卡上的按钮,应替换第一个选项卡上的片段,并显示另一个片段 我试图实现这一点,但是在更换时有一个黑色的片段。

  • 在我的应用程序中,我有5个片段。我使用底部导航来管理它们。但在第一个片段中,我有回收器视图,当我单击回收器项目时,我需要在此选项卡(第一个选项卡)中打开第二个片段。 现在,当我试图打开第二个片段时,他打开了所有标签上方。 这就是我如何打开第二个碎片