1

我有必要用另外两个片段(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 可见并将两个片段添加到每个帧,在同一个片段事务中。

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 嵌套在另一个片段中;

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

4

2 回答 2

0

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

  1. 创建两个活动ActivityA和ActivityBC
  2. 使用无线电组创建另一个片段
  3. 将 FragmentRadio 嵌入到 ActivityA 和 ActivityBC 中
  4. 让该片段在完成当前活动的同时根据选择开始新活动
于 2013-05-26T19:49:37.040 回答
0

制作这样的字段:

private static final String FRAGMENT_B_TAG = "fragmentB";

添加片段时,请使用 static Strings like 标记:

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

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

希望能帮助到你。

于 2013-05-26T20:03:35.267 回答