android - 使用导航组件导航出 ViewPager 选项卡
问题描述
首先,一些澄清。在查看了许多其他相关问题之后,让我们从这不是什么开始:
- 这与底部导航无关
- 这不是关于使用导航组件操作 ViewPager(就像这个)
这个问题是关于如何使用导航组件,当 Viewpager 是组件之一时。
情况是有 3 个选项卡:TabA、TabB 和 TabC 还有 2 个额外的片段:FragA、FragB
我如何将它们全部连接起来: ViewPagerAdapter 正在处理 TabA、TabB 和 TabC 并且nav_praph 将处理从:
- TabA --> FragA
- TabB --> FragB
- TabC --> FragA (不是错字)
所需的 UI 行为 第一个选项:我能得到的最好的工作是在其中一个选项卡(例如 TabA)内定义 FragHost,然后导航到 FragA。问题是导航是在选项卡内完成的。这意味着用户仍然会看到顶部的选项卡,并且仍然可以滑动到其他选项卡。不是我想要的。这是有效的图表,但不是我想要的(红色代表托管片段)
第二种选择:将 fragHost 移动到最顶部,并让它包含 ViewPager 以便它占据全屏。然后在 nagGraph 中提到
<navigation
android:id="@+id/nav_graph"
app:startDestination="@id/tab_a"
>
<fragment
android:id="@+id/tab_a"
android:name="com.myapp.home.views.TabA"
android:layout="@layout/tab_a_layout"
>
<action
android:id="@+id/action_tab_a_to_frag_a"
app:destination="@+id/frag_a"
/>
</fragment>
<fragment
android:id="@+id/frag_a"
android:name="com.myapp.FragA"
android:label="details"
android:layout="@layout/frag_a"
/>
这导致了IllegalStateException
......at androidx.fragment.app.FragmentStore.addFragment
一些调试,我看到它试图添加 TabA 两次。我假设 ViewPagerAdapter 和 Nav Component 都在使用 Fragment 管理器。
我如何进行正常导航,您可以在其中使用选项卡,但单击一个会带您进入选项卡顶部的另一种全屏体验?
解决方案
弄清楚我提到的第二个选项是正确的方法。写在这里以防其他人有同样的问题。
确保您的 nav_graph 指向 ViewPager 的包含片段,而不是 ViewPager 持有的特定片段。所以不是来自 TabA 而是来自托管 ViewPager 的 ContainerFragmentA
<navigation
android:id="@+id/nav_graph"
app:startDestination="@id/view_pager_hosting_frag"
>
<fragment
android:id="@+id/view_pager_hosting_frag"
android:name="com.myapp.home.views.ViewPagerHostingFrag"
android:layout="@layout/view_pager_layout"
>
<action
android:id="@+id/action_tab_a_to_frag_a"
app:destination="@+id/frag_a"
/>
</fragment>
<fragment
android:id="@+id/frag_a"
android:name="com.myapp.FragA"
android:label="details"
android:layout="@layout/frag_a"
/>
然后您可以从任何选项卡中选择您想要的操作以转到正确的位置
推荐阅读
- sql - 将几个 UNION ALL 组合成一个查询
- android - asynctask android如何从php后端获取json响应
- google-cloud-platform - 获取令牌失败,消息:FIS_AUTH_ERROR
- java - 在 android studio 中创建依赖微调器?根据宠物的类型选择宠物类型,然后选择品种,例如狗,然后选择品种
- python - 虚线模糊了图像的一部分
- data-modeling - 数据仓库设计应该先规划采购模块还是库存
- ios - 在 Swift 中将数据保存到 sqlite3 数据库中
- vb.net - 如何使用少数 subs 来拆分代码过程
- python-3.x - 如何将文件读取为 .dat 并将其写入为 .txt
- angular - Angular - 对图像 URL 进行清理的斗争