Насколько я понимаю при нажатии на item, которые находятся сбоку, мы открываем фрагмент.
Интересует следующий вопрос:как на главную активность добавить фрагмент и замещать
его при нажатии на один из итемов?
Ответы
Ответ 1
При работе со связкой Navigation Drawer + Fragments можно выделить два механизма
работы приложения:
При выборе в Navigation Drawer определенного фрагмента, текущий видимый фрагмент
скрывается (hide) и отображается (show) выбранный фрагмент.
При выборе в Navigation Drawer определенного фрагмента, текущий видимый фрагмент
замещается (replace) выбранным фрагментом (см. ниже пояснение).
Принципиальная разница между этими двумя подходами заключается в том, что в первом
случае, скрываемый фрагмент не изменяет свое состояние и методы его жизненного цикла
(при его скрытии и отображении) не вызываются. Во втором же случае, для фрагмента,
который замещается будут последовательно вызваны методы его жизненного цикла:
onPause();
onStop();
onDestroyView();
onDestroy();
onDetach().
Следовательно, в первом случае, при возвращении к скрытому фрагменту мы увидим его
состояние на момент скрытия, а во втором случае фрагмент будет создан с нуля, то есть
данные, которые находились на нем, мы уже не увидим.
(пояснение): честно говоря, навскидку не могу сказать, в какой ситуации можно, а
точнее нужно применять второй подход (именно при смене фрагментов из Navigation Drawer)...
но чисто технически это возможно (и в каких-то случаях может даже и нужна именно такая
логика работы).
В подавляющем же большинстве случаев используется именно первый подход, потому как
именно он наиболее логичен при использовании Navigation Drawer + Fragments: пользователь
может переключаться между экранами без потери данных на них.
Пусть имеются два фрагмента: FragmentA и FragmentB, ниже я приведу два метода: первый
(changeFragment(...)) используется для переключения (скрытия/показа) фрагментов без
потери данных, а второй (replaceFragment(...)) – для замещения одного фрагмента другим.
private void changeFragment(String neededToShowFragmentTag) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
List existingFragments = fragmentManager.getFragments();
Fragment currentShownFragment = null;
if (existingFragments != null) {
for (Fragment fragment : existingFragments) {
if (fragment.isVisible()) {
currentShownFragment = fragment;
break;
}
}
}
if (currentShownFragment == null || !currentShownFragment.getTag().equals(neededToShowFragmentTag)) {
Fragment neededToShowFragment = fragmentManager.findFragmentByTag(neededToShowFragmentTag);
if (neededToShowFragment == null) {
switch (neededToShowFragmentTag) {
case "fragment_a":
neededToShowFragment = new FragmentA();
break;
case "fragment_b":
neededToShowFragment = new FragmentB();
break;
}
fragmentTransaction.add(R.id.fragments_container, neededToShowFragment,
neededToShowFragmentTag);
}
if (currentShownFragment != null) {
fragmentTransaction.hide(currentShownFragment);
}
fragmentTransaction.show(neededToShowFragment).commit();
}
}
private void replaceFragment(String neededToShowFragmentTag) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment neededToShowFragment = fragmentManager.findFragmentByTag(neededToShowFragmentTag);
if (neededToShowFragment == null) {
switch (neededToShowFragmentTag) {
case "fragment_a":
neededToShowFragment = new FragmentA();
break;
case "fragment_b":
neededToShowFragment = new FragmentB();
break;
}
if (fragmentManager.getFragments() == null) {
fragmentTransaction.add(R.id.fragments_container, neededToShowFragment,
neededToShowFragmentTag);
} else {
fragmentTransaction.replace(R.id.fragments_container, neededToShowFragment,
neededToShowFragmentTag);
}
fragmentTransaction.commit();
}
}
Далее размещаю layout-файлы и код всех классов, дабы Вы смогли легко у себя все это
собрать и посмотреть разницу.
menu_main.xml:
activity_main.xml:
fragment_a.xml:
Комментариев нет:
Отправить комментарий