Берем пример по ссылке – работает отлично. Добавляем одну ма-а-аленькую строчку:
и тут же выясняется, что заголовок в ActionBar при возврате не обновляется, равно как и позиция в самом Navigation Drawer… Казалось бы – можно поручить обновление заголовка самому фрагменту, но, во-первых, это не тривиально, т.к. из FragmentActivity нет прямого доступа к getSupportActionBar(), а, во-вторых, надо же еще как-то Navigation Drawer извещать о том, что подсветить следует совсем другой пункт списка. А какой?

Мое решение ниже.
Чтобы получить из фрагмента доступ к родному ActionBar и Navigation Drawer, логичнее всего использовать слушатель для связи с Activity, которая содержит фрагмент. Это решение, кстати, и сам Гугл предлагает для такого взаимодействия.
Все замечательно, заголовок в Activity передать легко, но каким образом фрагмент может сообщить Navigation Drawer о том, какой именно пункт списка выделить? Отправить номер своей позиции, о которой он, типа, откуда-то знает?
Усложним задачу – есть несколько Activity, которые могут использовать одни и те же фрагменты, причем, в разных позициях Navigation Drawer. Тут уже прямой отправкой номера позиции из фрагмента не обойдешься. И хорошо, ибо это уже костылище, в отличие от отправки заголовка, который – так, костыленок.
В общем, прописываем куда-нибудь константы с типами всех фрагментов (у меня они уже были в фабрике фрагментов):
и передаем их в Activity, которая сама уж разберется, к какой позиции Navigation Drawer сейчас этот фрагмент приписан.
А заголовок мне все равно пришлось отправлять, а не генерировать в Activity, т.к. порой он привязан к содержимому фрагмента (например, ФИО автора или название открытого рассказа), а генерить лишний запрос к базе не хочется.
В общем, вот такой интерфейс:
Его имплементит Activity и реализует метод:
где setTitle – из гугловского примера.
Сами фрагменты в onAttach регистрируют Activity как слушатель и вызывают его в onCreateView или в onActivityCreated с его, фрагмента, индивидуальными заголовком и типом:
Но одну проблему мне так и не удалось решить. Почему-то, когда отлистываешь фрагменты назад до конца, Activity на закуску показывает пустой экран и закрывается только по еще одному нажатию кнопки Back. При этом на этом пустом экране стек фрагментов нулевой длины – с фига бы не закрыться? Пришлось добавить в Activity костыль:
С чем это связано, и как грамотно решить проблему – пока непонятно.
fragmentTransaction. addToBackStack(null);
и тут же выясняется, что заголовок в ActionBar при возврате не обновляется, равно как и позиция в самом Navigation Drawer… Казалось бы – можно поручить обновление заголовка самому фрагменту, но, во-первых, это не тривиально, т.к. из FragmentActivity нет прямого доступа к getSupportActionBar(), а, во-вторых, надо же еще как-то Navigation Drawer извещать о том, что подсветить следует совсем другой пункт списка. А какой?

Мое решение ниже.
Чтобы получить из фрагмента доступ к родному ActionBar и Navigation Drawer, логичнее всего использовать слушатель для связи с Activity, которая содержит фрагмент. Это решение, кстати, и сам Гугл предлагает для такого взаимодействия.
Все замечательно, заголовок в Activity передать легко, но каким образом фрагмент может сообщить Navigation Drawer о том, какой именно пункт списка выделить? Отправить номер своей позиции, о которой он, типа, откуда-то знает?
Усложним задачу – есть несколько Activity, которые могут использовать одни и те же фрагменты, причем, в разных позициях Navigation Drawer. Тут уже прямой отправкой номера позиции из фрагмента не обойдешься. И хорошо, ибо это уже костылище, в отличие от отправки заголовка, который – так, костыленок.
В общем, прописываем куда-нибудь константы с типами всех фрагментов (у меня они уже были в фабрике фрагментов):
public static final int FRAGMENT_MAIN_CALENDAR = 1;
public static final int FRAGMENT_MAIN_CATALOG = 2;
public static final int FRAGMENT_MAIN_FAVORITES = 3;
public static final int FRAGMENT_AUTHOR_ABOUT = 4;
public static final int FRAGMENT_AUTHOR_STORIES = 5;
и передаем их в Activity, которая сама уж разберется, к какой позиции Navigation Drawer сейчас этот фрагмент приписан.
А заголовок мне все равно пришлось отправлять, а не генерировать в Activity, т.к. порой он привязан к содержимому фрагмента (например, ФИО автора или название открытого рассказа), а генерить лишний запрос к базе не хочется.
В общем, вот такой интерфейс:
public interface OnFragmentChangedListener {
public void onFragmentChanged(String title, int fragmentType);
}
Его имплементит Activity и реализует метод:
@Override
public void onFragmentChanged(String title, int fragmentType) {
switch (fragmentType) {
case FragmentsFabrica.FRAGMENT_MAIN_CALENDAR : mDrawerList.setItemChecked(0, true);
break;
case FragmentsFabrica.FRAGMENT_MAIN_CATALOG : mDrawerList.setItemChecked(1, true);
break;
case FragmentsFabrica.FRAGMENT_MAIN_FAVORITES : mDrawerList.setItemChecked(2, true);
break;
}
setTitle(title);
}
где setTitle – из гугловского примера.
Сами фрагменты в onAttach регистрируют Activity как слушатель и вызывают его в onCreateView или в onActivityCreated с его, фрагмента, индивидуальными заголовком и типом:
onFragmentChangedListener.onFragmentChanged(
getResources().getString(R.string.navigation_main_section1_title),
FragmentsFabrica.FRAGMENT_MAIN_CALENDAR);
Но одну проблему мне так и не удалось решить. Почему-то, когда отлистываешь фрагменты назад до конца, Activity на закуску показывает пустой экран и закрывается только по еще одному нажатию кнопки Back. При этом на этом пустом экране стек фрагментов нулевой длины – с фига бы не закрыться? Пришлось добавить в Activity костыль:
@Override
public void onBackPressed() {
super.onBackPressed();
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() == 0)
this.finish();
}
С чем это связано, и как грамотно решить проблему – пока непонятно.