【发布时间】:2013-03-14 14:06:16
【问题描述】:
我正在为 4.0 和 4.1 平板电脑编写应用程序,我不想使用支持库(如果不需要的话),因此只能使用 4.x api。
所以我的目标平台非常明确地定义为:>= 4.0 和
该应用具有多窗格布局(两个片段,左侧一个小片段,右侧一个内容片段)和一个带有选项卡的操作栏。
与此类似:
单击操作栏上的选项卡会更改“外部”片段,然后内部片段是具有两个嵌套片段的片段(1. 左侧小列表片段,2. 宽内容片段)。
我现在想知道替换片段,尤其是嵌套片段的最佳做法是什么。 ViewPager 是支持库的一部分,此类没有本机 4.x 替代方案。在我的意义上似乎被“弃用”。 - http://developer.android.com/reference/android/support/v4/view/ViewPager.html
然后我阅读了 Android 4.2 的发行说明,关于 ChildFragmentManager,这很合适,但我的目标是 4.0 和 4.1,所以也不能使用。
ChildFragmentManager 仅在 4.2 中可用
- http://developer.android.com/about/versions/android-4.2.html#NestedFragments
- http://developer.android.com/reference/android/app/Fragment.html#getChildFragmentManager()
不幸的是,即使在整个 Android 开发人员指南中,也几乎没有任何好的示例可以展示在没有支持库的情况下使用 Fragment 的最佳实践;尤其是与嵌套片段无关。
所以我想知道:如果不使用支持库和它附带的所有东西,就不可能编写带有嵌套片段的 4.1 应用程序吗? (需要使用 FragmentActivity 而不是 Fragment 等?) 或者最佳做法是什么?
我目前在开发中遇到的问题正是这样的说法:
Android 支持库现在也支持嵌套片段,因此您 可以在 Android 1.6 及更高版本上实现嵌套片段设计。
注意:当该布局时,您不能将布局膨胀为片段 包括
<fragment>。仅在添加时才支持嵌套片段 动态到一个片段。
因为我在 XML 中定义了嵌套片段,这显然会导致如下错误:
Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f090009, tag frgCustomerList, or parent id 0x7f090008 with another fragment for de.xyz.is.android.fragment.CustomerListFragment_
目前,我自己总结:即使在 4.1 上,当我什至不想针对 2.x 平台时,如果没有支持库,截图中所示的嵌套片段是不可能的。
(这实际上可能更像是一个 wiki 条目而不是一个问题,但也许其他人之前已经管理过它)。
更新:
一个有用的答案是:Fragment Inside Fragment
【问题讨论】:
-
您有三个选择: 1. 仅针对具有原生嵌套片段的 4.2。 2. 目标 4.x 带有来自支持库的嵌套片段 3. 不要将嵌套片段用于任何其他平台目标场景。这应该可以回答您的问题。此外,您不能使用嵌入在 xml 布局中的嵌套片段,所有这些都必须添加到代码中。 在没有支持库的情况下,几乎没有任何好的示例展示片段使用的最佳实践 - 支持片段框架复制了原生框架,因此任何示例都应该以任何方式工作。
-
@Luksprog 感谢您的 cmets。我更喜欢您的解决方案 2,并且框架在支持库中运行良好,但 ActionBar 中的选项卡不能 - afaik,我需要使用 ActionBarSherlock,但选项卡不会集成到 ActionBar 中,而是仅集成在下方(这不是t 4.x 所必需的)。而且 ActionBar.TabListener 只支持来自 android.app.Fragment 的 Fragments,不支持来自支持库的片段。
-
我不熟悉 Galaxy 选项卡上的联系人应用程序,但请记住,您总是会遇到
ActionBar(三星内部构建)的自定义实现。仔细看看 ActionBarSherlock,如果有空间,它在 ActionBar 中有标签。 -
@Luksprog 我相信您已经提供了唯一要给出的答案,请您将其作为正确答案提供。
-
@Pork 我提出这个问题的主要原因是:嵌套片段是否有任何解决方法,而无需使用支持库及其所有其他视图元素。这意味着,如果我切换到支持库,我将使用 FragmentActivity 而不是 Fragment。但我确实想使用 Fragment,我想要的只是替换 Nested Fragments,但不是所有 v4 组件。 IE。通过其他开源库等。例如上面的屏幕截图在 4.0 上运行,我想知道他们是否使用 ABS、SupportLib 或其他任何东西。
标签: android android-fragments android-support-library android-nested-fragment