使用片段时更改ActionBar

Seb*_*oth 9 android android-fragments

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

第1页,第一次打开时.

然后,一旦用户点击"站点",我当然希望显示站点列表.我正在使用此代码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

此活动的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>
Run Code Online (Sandbox Code Playgroud)

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

单击

尽管ActionBar运行良好,它现在只适用于Title.

什么是行不通的,如果我现在回来.站点列表已隐藏,但旧的ActionBar未恢复:

从List按钮返回后的ActionBar

文档说添加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);
}
Run Code Online (Sandbox Code Playgroud)

但不知何故,一旦用户回到Fragment中,它就无法恢复.

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

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

Ret*_*ier 9

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

ActionBar与Activity本身相关联,而不是其中的特定Fragment.

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

您需要做的是覆盖站列表片段中的一个状态更改处理程序,以在删除/隐藏ActionBar更改时撤消它.

更好的方法是使用一个replace交易交换LongDistanceFragmentStationListFragment(而不是增加后者对前者的顶部).然后让他们设置了适当的时候,他们成为你可以添加代码,配置操作栏的每个片段可见(通过覆盖onResume)而不是在移除一个之后尝试清理.

  • ListFragment中的状态更改处理程序实际上都没有被调用,因此您无法执行此操作.这是API中的一个错过. (2认同)