在多个片段中的片段中实现选项卡

Posted

技术标签:

【中文标题】在多个片段中的片段中实现选项卡【英文标题】:implementing tabs in a fragment amidst multiple fragments 【发布时间】:2016-08-13 06:01:50 【问题描述】:

我有很多片段的唯一活动。 在其中一个片段中,我现在必须有几个标签。我能想到的方法是:

解决方案 1 - 为此创建一个新活动,然后实施 ViewPager:

我对该解决方案的主要担忧是: 到目前为止,在我的 Activity 上,我有以下流程: 片段 1 -> 片段 2 -> 片段 -> 3 -> 片段 4 -> 等等……

现在,假设我必须在片段 3 中实现这些选项卡。

从片段 2 开始,我开始一个新的活动,放置一个 viewpager(片段 3 在一个选项卡中,其他选项卡在其他选项卡中)。然后我需要能够显示片段 4 。但是由于应用程序中的所有片段都放在原始活动上,它会混淆流程甚至更糟。换句话说,导致:

    它根本不会显示片段 4 等等,因为正在运行的 Activity 将是持有选项卡屏幕的那个,而所有片段都放置在原始 Activity 上,该原始 Activity 将在堆栈中。 无法从片段 4 返回到带有选项卡的屏幕,然后从选项卡屏幕“返回”到片段 2,然后是 1。

解决方案 2 - 结果活动(带有视图寻呼机):

为选项卡屏幕创建的活动可能是返回原始活动的活动。所以流程是这样的: 片段 2 -> 结果的新活动 -> 将结果发送回原始活动,说明它现在需要启动片段 4 -> 原始活动打开片段 4。

但是,在这种情况下,如果我从片段 4 向后退,它会将我抛回片段 2 而不是那个选项卡屏幕 (3)。

解决方案 3 - 标签布局:

似乎是最好的解决方案。 但是,要使用它,我需要 getChildFragmentManager() ,这需要 api 17 及更高版本。我的api是16。 现在,如果我使用getSupportChildFragmentManager(),我将不得不使用片段 v4。问题是我所有的片段都是原生的,我不能只是将片段 3 更改为 v4,因为之前的片段和后面的片段也必须是 v4。更改所有片段不是一个选项,因为我有大约 50 个片段。

解决方案 3 的另一个问题 我遇到过,是它崩溃并打印:Error inflating class android.support.design.widget.TabLayout 我尝试创建一个名为 values-v21 的新文件夹,并在那里为选项卡布局创建了一个 styles.xml,但由于某种原因这没有帮助。

我希望我说清楚了。

【问题讨论】:

更改所有片段不是一个选项,因为我有超过一百个片段。 - 这将转化为 Android Studio 中的几次击键。真正的问题是为什么你有超过一百个碎片? 大应用。抱歉,我刚刚查了一下——这个数字有点夸张。实际数量约为 50 个片段(不包括不同的视图或内容视图)。还是很多。坦率地说,我有点不愿意将它们全部更改为 v4 ,因此不会出现任何新的问题/错误/崩溃......所以我不确定将它们全部转换为有多安全v4。但我可能错了。谢谢 关于解决方案 1,if 片段 4 将仅从包含 ViewPager 的片段 3 开始,我认为拆分为 2 个活动没有问题(1 到片段 3 和其他继续)。解决方案 2 并不是一个真正的选择。您还可以从解决方案 3 派生解决方案 4:创建一个包含 ViewPager 的片段并让 Viewpager 仅使用普通布局(无嵌套片段),将这些布局的处理留给持有 ViewPager 的片段。这将为您赢得时间,直到 API 16 被遗忘,您可以重构它以使用本机嵌套片段。 关于解决方案 1,如果我拆分为 2 个活动,则会出现问题,因为当我要打开片段 4 时,它将提交到原始活动上,该活动位于后堆栈中,所以用户不会看到片段 4。我错过了什么吗?关于您提供的第二种解决方案,我不确定我是否理解它。我将如何在片段中实现 ViewPager?不是只有活动可以吗? Fragments 只能实现 Tab Layout.no?您会从您提供的这两种解决方案中选择什么?再次感谢您。 好的,所以我选择了第二个选项,即使用带有布局而不是片段的 viewpager。但是,似乎我必须使用 PagerTabStrip 来表示页面标题。有没有替代方案,这样我就可以在屏幕上看到我的所有标签,而无需横向滑动,而不是像在 PagerStrip 中那样部分? 【参考方案1】:

您有另一个从解决方案 3 派生的解决方案。这是为了保留您当前的导航(fragment1->fragment2->etc)并构建一个片段来保存具有简单布局而不是嵌套片段的 ViewPager。这样您可以避免:导航问题、有问题的嵌套 api 不存在于版本 16(您计划支持)上,并且您还可以避免重构以使用支持片段 api。

如果以后您放弃对版本 16 的支持,您可以重构嵌套片段中的每个简单布局并使用本机 getChildFragmentmanager()。

【讨论】:

由于某种原因,我不断收到此“错误夸大 TabLayout”崩溃。我已将 styles.xml 添加到 values-v21 文件夹(似乎适用于所有人的解决方案)但它没有t 帮助..

以上是关于在多个片段中的片段中实现选项卡的主要内容,如果未能解决你的问题,请参考以下文章

Android - 一个选项卡中的多个片段

使用 Fragments 为 Android 中的每个选项卡单独返回堆栈

在 ViewPager 的多个选项卡中使用单个片段

以编程方式使用选项卡更改片段的选项卡索引

如何在每个操作栏选项卡中维护多个Fragment堆栈或多个子片段

切换到片段选项卡主机中的选项卡时查看寻呼机丢失其内容