Найкращий підхід - використовувати метод інтерфейсу OnBackStackChangedListener, наданий андроїдом, onBackStackChanged ().
Скажімо, у нас є шухляда для навігації з 4 опціями, до яких користувач може перейти. У такому випадку ми матимемо 4 фрагменти. Давайте спочатку побачимо код, а потім я пояснить, як це працює.
private int mPreviousBackStackCount = 0;
private String[] title_name = {"Frag1","Frag2","Frag3","Frag4"};
Stack<String> mFragPositionTitleDisplayed;
public class MainActivity extends ActionBarActivity implements FragmentManager.OnBackStackChangedListener
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
....
....
getSupportFragmentManager().addOnBackStackChangedListener(this);
mFragPositionTitleDisplayed = new Stack<>();
}
public void displayFragment() {
Fragment fragment = null;
String title = getResources().getString(R.string.app_name);
switch (position) {
case 0:
fragment = new Fragment1();
title = title_name[position];
break;
case 1:
fragment = new Fragment2();
title = title_name[position];
break;
case 2:
fragment = new Fragment3();
title = title_name[position];
break;
case 3:
fragment = new Fragment4();
title = title_name[position];
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container_body, fragment)
.addToBackStack(null)
.commit();
getSupportActionBar().setTitle(title);
}
}
@Override
public void onBackStackChanged() {
int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
if(mPreviousBackStackCount >= backStackEntryCount) {
mFragPositionTitleDisplayed.pop();
if (backStackEntryCount == 0)
getSupportActionBar().setTitle(R.string.app_name);
else if (backStackEntryCount > 0) {
getSupportActionBar().setTitle(mFragPositionTitleDisplayed.peek());
}
mPreviousBackStackCount--;
}
else{
mFragPositionTitleDisplayed.push(title_name[position]);
mPreviousBackStackCount++;
}
}
У наведеному коді ми маємо метод displayFragment (). Тут я відображаю фрагмент на основі опції, вибраної з панелі навігації. Позиція змінної відповідає позиції елемента, натиснутого з ListView або RecyclerView у навігаційному ящику. Я відповідно встановлюю заголовок панелі дій за допомогою getSupportActionBar.setTitle (заголовок), де заголовок зберігає відповідну назву заголовка.
Кожного разу, коли ми клацаємо елемент із навігатора, відображається фрагмент, залежно від елемента, натиснутого користувачем. Але з тильної сторони цей фрагмент додається до бекстейка, і метод onBackStachChanged () потрапляє в удар. Що я зробив, це те, що я створив змінну mPreviousBackStackCount і ініціалізував її до 0. Я також створив додатковий стек, який буде зберігати імена заголовків рядка дій. Кожного разу, коли я додаю новий фрагмент до backstack, я додаю відповідне ім'я заголовка до мого створеного стека. На протилежному боці кожного разу, коли я натискаю кнопку "Назад", викликається onBackStackChanged (), і я висуваю останню назву заголовка зі свого стека і встановлюю заголовок на ім'я, отримане методом peek () стека.
Приклад:
Скажімо, наш Android Backstack порожній:
Натисніть Вибір 1 з навігаційної шухляди: викликається onBackStachChanged (), а фрагмент 1 додається до backstack андроїда, backStackEntryCount встановлюється в 1, а Frag1 висувається до мого стека, і розмір mFragPositionTitleDisplayed стає 1.
Натисніть Вибір 2 з навігаційної шухляди: викликається onBackStachChanged (), а фрагмент 2 додається до backstack андроїда, backStackEntryCount встановлюється на 2, а Frag2 пересувається до мого стека, і розмір mFragPositionTitleDisplayed стає 2.
Тепер у нас є 2 елементи як в андроїд-стеку, так і в моєму стеку. При натисканні кнопки повернення onBackStackChanged () викликається і значення backStackEntryCount дорівнює 1. Код вводить частину if і вискакує останній запис із мого стека. Отже, андроїд-бекстейк має лише 1 фрагмент - «Фрагмент 1», а мій стек має лише 1 заголовок - «Фраг1». Тепер я просто виглядаю () заголовок зі свого стека і встановлюю панель дій для цього заголовка.
Запам’ятайте: щоб встановити заголовок дії bat, використовуйте peek (), а не pop (), інакше ваша програма буде аварійно працювати, коли ви відкриєте більше 2 фрагментів і спробуєте повернутися назад, натиснувши кнопку назад.
getActivity().setTitle(...)
), але це розумний підхід. Дякую.