Проблема вкратце:
У меня есть MainActivity
, который содержит BottomNavigationView
и FrameLayout
поверх него. BottomNavigationView
имеет 5 вкладок, и при нажатии на вкладку я добавляю фрагмент к этому FrameLayout
. Но из какого-то фрагмента мне нужно открыть другой фрагмент. Из этого другого фрагмента мне нужно открыть другой. Каждый раз, когда мне нужно показать фрагмент, я уведомляю MainActivity из фрагмента, что ему нужно добавить еще один. Каждый фрагмент проверки выполняет свою деятельность, реализует интерфейс. И это раздражает. Итак, если у меня есть 100 фрагментов, MainActivity реализует слишком много интерфейсов. Это приводит к шаблону кода. Итак, как правильно перемещаться между фрагментами, если у вас много?
Проблема в деталях:
Пожалуйста, сначала прочтите проблему в коротком разделе.
Как я уже сказал, у меня есть BottomNavigationView
, который имеет 5 вкладок. Назовем фрагменты, отвечающие за каждую вкладку, FragmentA
, FragmentB
, FragmentC
, FragmentD
, FragmentE
. Я действительно знаю, как показать эти фрагменты при нажатии на вкладку. Я просто заменяю / добавляю эти фрагменты в активность. Но подождите, что если вы хотите перейти с FragmentA
на FragmentF
? После этого с FragmentF
до FragmentG
? Вот как я решаю эту проблему: с FragmentF
или FragmentG
я уведомляю MainActivity
, что хочу изменить фрагмент. Но как они общаются с MainActivity
? Для этого у меня есть интерфейсы внутри каждого фрагмента. MainActivity реализует эти интерфейсы. И вот проблема. MainActivity реализует слишком много интерфейсов, что приводит к шаблонному коду. Итак, каков наилучший способ навигации по фрагментам? Я даже не трогаю, что мне также нужно справляться с нажатиями кнопок назад :)
Вот как выглядит мой код:
MainActivity, реализующее интерфейсы для изменения фрагментов при необходимости:
class MainActivity : AppCompatActivity(), DashboardFragment.OnFragmentInteractionListener,
PaymentFragment.BigCategoryChosenListener, PaymentSubcategoryFragment.ItemClickedListener, PayServiceFragment.OnPayServiceListener, ContactListFragment.ContactTapListener, P2PFragment.P2PNotifier
Вот метод onAttach моего PaymentFragment, например:
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof BigCategoryChosenListener) {
listener = (BigCategoryChosenListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement BigCategoryChosenListener");
}
}
И с помощью этого listener
я уведомляю активность для изменения фрагмента. И в КАЖДОМ фрагменте я должен это сделать. Я не думаю, что это лучшая практика. Так это нормально или есть лучший способ?