使用片段时更改ActionBar

时间:2011-10-19 08:38:54

标签: android android-fragments

在片段中,在一个活动中调用我正在显示这样的总线行列表:

Page 1, when opening for the first time.

然后,一旦用户点击“电台”,我当然希望显示一个电台列表。 我正在使用此代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.act_long_distance);

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.f_long_distance, new LongDistanceFragment()).commit();
}

@SuppressWarnings({"UnusedDeclaration"})
public void showStationList(View view) {
    String tag = (String) view.getTag();
    if (tag != null && tag.length() > 0) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        StationListFragment fragment = new StationListFragment(tag.split(","));
        ft.add(R.id.f_long_distance, fragment);
        // ft.replace(R.id.f_long_distance, fragment);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.addToBackStack(null);
        ft.commit();
    }
}

此活动的XML是:

<LinearLayout
    android:id="@+id/ll_container"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
    <FrameLayout
        android:id="@+id/f_long_distance"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</LinearLayout>

StationListFragment是一个简单的 ListFragment ,显示在另一个之上:

After clicking on the Station List button

尽管ActionBar运行良好,但它现在只适用于标题。

如果我现在按返回,那么什么不起作用。“电台列表”已隐藏,但旧的ActionBar未恢复:

ActionBar after coming back from List button

文档说添加ActionBar的方法是使用onCreateOptionsMenu方法等。

所以,在LongDistanceFragment(显示的第一个)中,我正在创建这样的栏:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    Log.d(TAG, "onViewCreated");
    super.onViewCreated(view, savedInstanceState);

    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);

    ActionBar bar = getSupportActivity().getSupportActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
    bar.setListNavigationCallbacks(new SimpleSpinnerArrayAdapter(getActivity()), this);
}

但不知何故,一旦用户回到片段中,它就不会被恢复。

我认为需要一种在回滚片段事务时恢复ActionBar状态的方法。

我错过了什么?谢谢你的帮助。

2 个答案:

答案 0 :(得分:9)

如果我正确理解您的代码,问题可能出在您的StationListFragment

ActionBar与Activity本身相关联,而不是其中的特定片段。

我猜测你在StationListFragment中修改ActionBar以显示“Stations”标题并禁用List导航模式。在这种情况下,按后退按钮撤消事务 - 有效删除StationListFragment - 但不会自动撤消您对Activity的Action Bar所做的任何更改。

您需要做的是覆盖Station List Fragment中的一个状态更改处理程序,以便在删除/隐藏ActionBar更改时撤消它。

更好的方法是使用replace交易将LongDistanceFragmentStationListFragment交换(而不是在前者之上添加后者。)然后您可以添加用于为每个片段配置操作栏的代码,以便在它们变得可见时(通过覆盖onResume)进行适当的设置,而不是在删除一个片段后进行清理。

答案 1 :(得分:1)

我正在处理同样的问题,当我在第二个片段的onStop方法中恢复对ActionBar的更改时,它运行正常。