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



我使用FragmentPagerAdapter来显示myrag类型的几个选项卡(与Fragments相关联)。在myrag . oncreateview()中,我通过编程方式膨胀了一对内部片段:MyInternalF1和MyInternalF2。

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

我正在使用选项卡/分页样本小部件从v13样本:样品/Support13Demos/src/com/example/android/supportv13/app/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();
    ....
}

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

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

不管怎样,我现在有一个变通办法。您只需在onCreate函数中手动修改容器的ID。然后将修改后的ID传递给add()函数。参见:编程视图如何设置唯一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;
    }
}

最新更新