我有必要用另外两个片段(B和C,在“通常”列表+查看器配置中)替换一个活动的一个起始片段(我称之为A)。目前我有一个相对布局,有两个框架布局作为B和C的占位符:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RadioGroup
android:id="@+id/radiogroup_navigation"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<!-- Some radiobuttons (not displayed for the sake of brevity) -->
</RadioGroup>
<FrameLayout
android:id="@+id/frame_list"
android:layout_width="100dp"
android:layout_height="fill_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_below="@id/radiogroup_navigation">
</FrameLayout>
<FrameLayout
android:id="@+id/frame_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_below="@id/radiogroup_navigation"
android:layout_toRightOf="@id/frame_list">
</FrameLayout>
当我需要显示A时,我只是隐藏 frame_list 并将A添加到 frame_view ,当我需要显示B和CI时 frame_list visible < / strong>再次将两个片段添加到每个帧中,在同一个片段事务中。
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.remove(fragmentA);
t.add(R.id.frame_list, fragmentB);
t.add(R.id.frame_view, fragmentC);
t.addToBackStack(null);
t.commit();
通过这种方式,当我按下后退按钮时,C和B都会消失,我回到A片段,但现在 frame_list 可见(并且为空)。
我正在考虑以两种可能的方式解决问题:
但我也觉得我可能会以错误的方式看问题,也许有一个更清洁的设计解决方案。你有什么建议吗?
答案 0 :(得分:0)
如果我理解正确,这是一个解决方案:
答案 1 :(得分:0)
制作以下字段:
private static final String FRAGMENT_B_TAG = "fragmentB";
添加片段时,请使用静态String
标签:
t.add(R.id.frame_list, fragmentB, FRAGMENT_B_TAG);
t.add(R.id.frame_view, fragmentC, FRAGMENT_C_TAG);
在您的活动中,设置一个监听器,每次拨打addToBackStack(String)
后都会触发该监听器。它将找出当前可见的片段并隐藏/显示所需的容器。
getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
FragmentA fa = getSupportFragmentManager().findFragmentByTag(FRAGMENT_A_TAG);
FragmentB fb = getSupportFragmentManager().findFragmentByTag(FRAGMENT_B_TAG);
if (fa != null && fa.isVisible()) {
// Fragment A is visible, so hide the second container which is now empty
}
if (fb != null && fb.isVisible()) {
// Fragment B is visible, so show the second container
}
}
});
请注意,检查Fragment C
是否可见是不可见的,因为当Fragment B
可见时,Fragment C
也始终可见。
这是一个未经测试的代码,但我认为它应该可行。此外,如果您需要任何解释,请不要犹豫。
希望它有所帮助。