2013-04-07 50 views
1

我正在使用FragmentPagerAdapter显示MyFrag类型的多个选项卡(与片段关联)。在MyFrag.onCreateView()中,我以编程方式膨胀一些内部碎片:MyInternalF1和MyInternalF2。Android PagerAdapter,添加手动膨胀片段的问题

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

我使用从V13样本的选项卡/寻呼机样品插件: 样本/ 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

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

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

无论如何,我现在有一个解决方法。您只需在onCreate函数中手动修改容器的ID即可。然后将修改的ID传递给add()函数。 另请参阅:Programmatic Views how to set unique id's?(for 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; 
    } 
}