我正在使用FragmentPagerAdapter来显示MyFrag类型的几个标签(与片段相关联)。在MyFrag.onCreateView()中,我以编程方式为几个内部片段充气:MyInternalF1和MyInternalF2。
我得到的是一个尴尬的显示结果。外部的MyFrag实例很好 - 并且与它们的选项卡相关联。但是内部碎片嵌入在错误的碎片中......第一个MyFrag确实包含它自己的内部Frags,但是第2个,第3个,等等MyFrags要么没有任何内部Frags,要么托管其他一些Frament的内部Frags。 (内部片段工作正常,它们只是位于随机片段上)。
我正在使用v13示例中的tabs / pager示例窗口小部件: 样本/ 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();
....
}
答案 0 :(得分:1)
问题出在FragmentTransaction.add()函数中。作为第一个参数,它包含包含视图的ID - containerViewId。您无法直接传递视图,您必须使用ID。显然,对于膨胀的视图,容器视图的id对于所有膨胀的接口都是相同的。由于它们都驻留在同一个活动中 - 事务选择它找到的第一个视图实例。你无法控制它。因此,当MyFragment调用onCreate()时,内部片段可能会添加到不属于其父级的视图中。
这是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;
}
}