Android PagerAdapter,添加手动膨胀片段的问题

时间:2013-04-07 14:51:04

标签: fragment layout-inflater fragmentpageradapter

我正在使用FragmentPagerAdapter来显示MyFrag类型的几个标签(与片段相关联)。在MyFrag.onCreateView()中,我以编程方式为几个内部片段充气:MyInternalF1和MyInternalF2。

我得到的是一个尴尬的显示结果。外部的MyFrag实例很好 - 并且与它们的选项卡相关联。但是内部碎片嵌入在错误的碎片中......第一个MyFrag确实包含它自己的内部Frags,但是第2个,第3个,等等MyFrags要么没有任何内部Frags,要么托管其他一些Frament的内部Frags。 (内部片段工作正常,它们只是位于随机片段上)。

我正在使用v13示例中的tabs / pager示例窗口小部件: 样本/ Support13Demos / SRC / COM /示例/机器人/ supportv13 /应用程序/ FragmentPagerSupport.java

伪代码:

Class MyFrag extends Fragment
{
    public View onCreateView(LayoutInflater inflater,
        ViewGroup container,Bundle savedInstanceState)
{
    super.onCreateView(inflater, container, savedInstanceState);
    ....
    FragmentTransaction trans = getFragmentManager().beginTransaction();
    trans.add(R.id.myfragContainer, new MyInternalF1, "InternalF1");
    trans.add(R.id.myfragContainer, new MyInternalF2, "InternalF2");
    trans.commit();
    ....
}

1 个答案:

答案 0 :(得分:1)

问题出在FragmentTransaction.add()函数中。作为第一个参数,它包含包含视图的ID - containerViewId。您无法直接传递视图,您必须使用ID。显然,对于膨胀的视图,容器视图的id对于所有膨胀的接口都是相同的。由于它们都驻留在同一个活动中 - 事务选择它找到的第一个视图实例。你无法控制它。因此,当MyFragment调用onCreate()时,内部片段可能会添加到不属于其父级的视图中。

这是FragmentTransaction API中的一个问题:如果它允许您指定一个显式View而不仅仅是一个ID作为父视图,那就太好了。见:http://code.google.com/p/android/issues/detail?id=54051

无论如何,我现在有一个解决方法。您只需在onCreate函数中手动修改容器的ID。然后将修改后的ID传递给add()函数。 另请参阅:Programmatic Views how to set unique id's?(对于generateViewId()函数)。

Class MyFrag extends Fragment
{
    public View onCreateView(LayoutInflater inflater,
        ViewGroup container,Bundle savedInstanceState)
    {
        super.onCreateView(inflater, container, savedInstanceState);
        ....
        int containerID = generateViewId();
        infView.findViewById(R.id.frag_container).setId(containerID);

        FragmentTransaction trans = getFragmentManager().beginTransaction();
        trans.add(containerID, new MyInternalF1, "InternalF1");
        trans.add(containerID, new MyInternalF2, "InternalF2");
        trans.commit();
        ....
        return infView;
    }
}