两个碎片代替一个

时间:2013-05-26 19:29:56

标签: android android-layout android-fragments

我有必要用另外两个片段(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 可见(并且为空)。

我正在考虑以两种可能的方式解决问题:

  • 覆盖onBackPressed以在需要时隐藏左框架;
  • 将B和C嵌套在另一个片段中;

但我也觉得我可能会以错误的方式看问题,也许有一个更清洁的设计解决方案。你有什么建议吗?

2 个答案:

答案 0 :(得分:0)

如果我理解正确,这是一个解决方案:

  1. 创建两个活动ActivityA和ActivityBC
  2. 使用radiogroup创建另一个片段
  3. 将FragmentRadio嵌入ActivityA和ActivityBC
  4. 让该片段在完成当前活动时根据选择开始新活动

答案 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也始终可见。

这是一个未经测试的代码,但我认为它应该可行。此外,如果您需要任何解释,请不要犹豫。

希望它有所帮助。