【问题标题】:Android PagerAdapter, problems adding manually inflated fragmentsAndroid PagerAdapter,添加手动充气片段的问题
【发布时间】:2013-04-07 14:51:04
【问题描述】:

我正在使用 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();
    ....
}

【问题讨论】:

    标签: fragment layout-inflater fragmentpageradapter


    【解决方案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 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多