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

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

Страница 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(); } } 

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, отображаемый поверх другого:

После нажатия кнопки «Список станций»

Что хорошо работает, это ActionBar, теперь он правильно содержит только Title.

Что не получается, если я отступлю назад . Список станций скрыт, но старый ActionBar не восстанавливается:

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); } 

Но как-то он не восстанавливается, как только пользователь возвращается в этот фрагмент.

Я думаю, что нужен способ восстановить состояние ActionBar при откате от Фрагментной транзакции.

Что мне не хватает? Спасибо за любую помощь.

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

ActionBar связан с самой Activity, а не с определенным фрагментом внутри него.

Я предполагаю, что в StationListFragment вы изменяете ActionBar для отображения заголовка «Stations» и отключите режим навигации List. В этом случае нажатие кнопки «Назад» отменяет транзакцию – эффективно удаляет элемент «StationListFragment», но не автоматически отменяет любые изменения, которые вы могли бы внести в панель действий Activity.

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

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

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