我希望有人可以清理我在这里做错了什么。在横向模式范例中,我在平板电脑上有一个共同的主要细节。唯一需要注意的是,master中的一些元素在Detail部分打开FragA,而其他元素在detail部分打开FragB。除了切换片段的实际过程外,一切似乎都很好。首先显示哪个片段是唯一显示的片段。我一直在使用replace方法将它们交换掉,并且我可以找到关于这个主题的所有SO注释指出,如果我在XML中添加了细节片段,这将无效。不幸的是,这不适用于我,因为我动态添加了所有片段。我的代码如下所示:
FragmentInfo frag = (Helper.isImageViewable(fileSelected)) ? getFragInfoByClass(ImageViewerFragment.class) : getFragInfoByClass(DownloadProgressFragment.class) ;
FragmentTransaction ft = getFragmentManager().beginTransaction();
if(frag.mFragment == null){
frag.mFragment = Fragment.instantiate(NewMainActivity.this, frag.mClass.getName());
ft.add(frag.target.getId(), frag.mFragment);
ft.commit();
ft = getFragmentManager().beginTransaction();
}
ft.replace(frag.target.getId(), frag.mFragment);
ft.commit();
这是在任何地方用于添加这些片段的唯一代码,而且似乎发生的情况是首先添加哪个片段工作正常,但替换方法根本不起作用。无论哪个片段都只是......还在那里。
有谁知道我做错了什么?
修改
布局文件的相关部分如下所示:
<LinearLayout
android:id="@+id/fragments_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<FrameLayout
android:id="@+id/list_fragment"
android:layout_width="0dp"
android:layout_weight="0.39"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/details_fragment"
android:layout_height="match_parent"
android:layout_weight="0.61"
android:layout_width="0dp" />
<!-- ADD METADATA VIEW HERE -->
</LinearLayout>
两个FragmentInfo对象都正确地具有带有id / details_fragment的FrameLayout的目标,正如任何一个在第一个添加的情况下正常工作所证明的那样。
编辑2 注意:使用这段代码也会得到完全相同的结果:
FragmentInfo frag = (Helper.isImageViewable(fileSelected)) ? getFragInfoByClass(ImageViewerFragment.class) : getFragInfoByClass(DownloadProgressFragment.class) ;
FragmentTransaction ft = getFragmentManager().beginTransaction();
if(frag.mFragment == null){
frag.mFragment = Fragment.instantiate(NewMainActivity.this, frag.mClass.getName());
ft.add(frag.target.getId(), frag.mFragment);
//ft.commit();
//ft = getFragmentManager().beginTransaction();
} else{
ft.replace(frag.target.getId(), frag.mFragment);
}
//ft.replace(frag.target.getId(), frag.mFragment);
ft.commit();
detailsContainer.setFragmentInfo(frag);
答案 0 :(得分:1)
替换实际上与一系列删除和添加操作相同。即使容器是空的,替换仍然是安全的(它与简单的添加相同)。我更喜欢使用显式删除和添加操作,因为它更容易推理它们。
我认为你的代码示例在开始时有一些问题,但是一旦初始化完成,似乎有一些正确的路径。在第一个代码示例中,您使用相同的片段实例调用add和replace(在尚未创建片段的情况下)。在第二个代码示例中,您不会删除旧片段(在尚未创建要添加的第二个片段的情况下)。
如果您注释掉(删除)双重添加,我认为您的第一个代码示例将正确执行替换操作:
FragmentInfo frag = (Helper.isImageViewable(fileSelected)) ? getFragInfoByClass(ImageViewerFragment.class) : getFragInfoByClass(DownloadProgressFragment.class) ;
FragmentTransaction ft = getFragmentManager().beginTransaction();
if(frag.mFragment == null){
frag.mFragment = Fragment.instantiate(NewMainActivity.this, frag.mClass.getName());
// ft.add(frag.target.getId(), frag.mFragment);
// ft.commit();
// ft = getFragmentManager().beginTransaction();
}
ft.replace(frag.target.getId(), frag.mFragment);
ft.commit();