我使用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;
}
}