Android 4.0,4.1(<4.2)中嵌套片段的最佳实践,不使用支持库

我正在为4.0和4.1平板电脑编写一个应用程序,我不想使用支持库(如果不需要),但4.x api只因此。

所以我的目标平台被很好地定义为:> = 4.0和< = 4.1 该应用程序有一个多窗格布局(两个片段,一个小在左边,一个内容片段在右边)和一个操作栏与选项卡。 类似于此: 单击操作栏上的选项卡将更改“外部”片段,然后内部片段是具有两个嵌套片段的片段(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开发人员指南;特别是关于嵌套片段。

所以我想知道:是不是不可能编写4.1应用程序嵌套片段,而不使用支持库和一切伴随它? (需要使用FragmentActivity而不是Fragment等等?)
或者最好的做法是什么?

我目前在开发中遇到的问题正是这样的说法:

> http://developer.android.com/about/versions/android-4.2.html#NestedFragments

The Android Support Library also now supports nested fragments, so you
can implement nested fragment designs on Android 1.6 and higher.

Note: You cannot inflate a layout into a fragment when that layout
includes a <fragment>. Nested fragments are only supported when added
to a fragment dynamically.

因为我把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平台时,如果没有支持库,在截图中所示的嵌套片段是不可能的。

(这可能实际上是一个维基条目比一个问题,但也许其他人已经管理它)。

更新:

有用的答案是:Fragment Inside Fragment

最佳答案
限制

因此,无论使用哪个版本的FragmentManager,都无法使用xml嵌套另一个片段内的片段。

所以你必须通过代码添加片段,这可能看起来像一个问题,但在长期使你的布局超灵活。

所以嵌套不使用getChildFragmentManger? childFragmentManager背后的核心是它推迟加载,直到前一个片段事务完成。当然,它只是在4.2或支持库自然支持。

嵌套没有ChildManager – 解决方案

解决方案,当然!我已经这样做了很长时间,现在,(自从ViewPager公布)。

见下文;这是一个延迟加载的Fragment,因此可以在其中加载Fragments。

它非常简单,Handler是一个真正非常方便的类,有效的处理程序等待一个空间在当前片段事务完成提交之后在主线程上执行(作为片段干扰他们在主线程上运行的UI)。

// Remember this is an example, you will need to modify to work with your code
private final Handler handler = new Handler();
private Runnable runPager;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    return inflater.inflate(R.layout.frag_layout, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);
    runPager = new Runnable() {

        @Override
        public void run()
        {
          getFragmentManager().beginTransaction().addFragment(R.id.frag_container, MyFragment.newInstance()).commit();
        }
    };
    handler.post(runPager);
}

/**
 * @see android.support.v4.app.Fragment#onPause()
 */
@Override
public void onPause()
{
    super.onPause();
    handler.removeCallbacks(runPager);
}

我不会考虑它的“最佳实践”,但我有现场应用程序使用这种黑客,我还没有任何问题。

我也使用这种方法嵌入视图寻呼机 – https://gist.github.com/chrisjenx/3405429

转载注明原文:Android 4.0,4.1(<4.2)中嵌套片段的最佳实践,不使用支持库 - 代码日志