Как правильно перемещаться между фрагментами в BottomNavigationView? - PullRequest
0 голосов
/ 26 июня 2018

Проблема вкратце:

У меня есть 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 я уведомляю активность для изменения фрагмента. И в КАЖДОМ фрагменте я должен это сделать. Я не думаю, что это лучшая практика. Так это нормально или есть лучший способ?

1 Ответ

0 голосов
/ 26 июня 2018

Хорошо. То, что вам нужно, это что-то подобное в действии, которое вы бы инициализировали в BottomNavigationView.

bottomNavigationView.setOnNavigationItemSelectedListener(
    new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {

               case R.id.menu_1://Handle menu click - 
                     //Call Navigator helper to replace Fragment to Fragment A
                     break;  
                case R.id.menu_2:
                    //Call Navigator helper to replace Fragment to Fragment B
                     break;

                case R.id.menu_3:
                   //Call Navigator helper to replace Fragment to Fragment C
                     break;
                  }
            return true;
        }

});

...