Изменение ActionBar при использовании фрагментов

во фрагменте, вызванном в рамках действия, я показываю список автобусных линий, как это:

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 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 ответов


если я правильно понимаю ваш код, проблема, вероятно, в вашем StationListFragment.

ActionBar связан с самой активностью, а не с конкретным фрагментом внутри нее.

Я предполагаю, что в StationListFragment вы изменяете панель действий, чтобы отобразить заголовок "станции" и отключить режим навигации по списку. В этом случае нажатие кнопки "Назад" отменяет транзакцию-эффективно удаляя StationListFragment - но не делает автоматически отмените все изменения, которые вы могли внести в панель действий действия.

что вам нужно сделать, это переопределить один из обработчиков изменения состояния в фрагменте списка станций, чтобы отменить изменения ActionBar при его удалении / скрытии.

лучше использовать replace транзакция для обмена LongDistanceFragment С StationListFragment (вместо того, чтобы добавлять последнее поверх первого.) Затем вы можете добавить код для настройки панели действий для каждого Фрагмент, поэтому они устанавливают его соответствующим образом, когда они становятся видимыми (путем переопределения onResume), а не пытаются очистить после была удалена.


Я имел дело с той же проблемой, и когда я возвращаю изменения в ActionBar в onStop метод второго фрагмента, он отлично работает.