Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

NavigationDrawer. Переходы между фрагментами

#java #android


Насколько я понимаю при нажатии на 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:

Комментариев нет:

Отправить комментарий