1

我正在使用 FragmentPagerAdapter 来显示 MyFrag 类型的几个选项卡(与 Fragments 相关联)。在 MyFrag.onCreateView() 中,我以编程方式对几个内部 Fragment 进行膨胀:MyInternalF1 和 MyInternalF2。

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

我正在使用来自 v13 示例的选项卡/寻呼机示例小部件:samples/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();
    ....
}
4

1 回答 1

1

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

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

无论如何,我现在有一个解决方法。您只需在 onCreate 函数中手动修改容器的 ID。然后将修改后的 ID 传递给 add() 函数。另请参阅:Programmatic Views 如何设置唯一 ID? (用于 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;
    }
}
于 2013-04-08T06:32:13.317 回答