在BottomNavigationView中的片段之间导航的正确方法是什么?

时间:2018-06-26 08:54:12

标签: android android-fragments bottomnavigationview

简短的问题:

我有一个MainActivity,在其顶部放置着BottomNavigationViewFrameLayoutBottomNavigationView有5个标签,点击标签时,我在该FrameLayout上添加了一些片段。但是,从某个片段开始,我需要打开另一个片段。从另一个片段中,我需要打开另一个片段。每当我需要显示片段时,我都会从片段通知MainActivity,它需要添加另一个片段。每个片段检查都执行其活动实现接口。这很烦人。因此,如果我有100个片段,MainActivity将实现太多接口。它导致样板代码。那么,如果有很多片段,如何在片段之间正确导航?

详细问题:

请先阅读短节中的问题。

正如我所说的,我有BottomNavigationView,它有5个标签。我们将负责每个标签的片段称为FragmentAFragmentBFragmentCFragmentDFragmentE。我真的知道,单击选项卡时如何显示这些片段。我只是在活动中替换/添加这些片段。但是,等等,如果您想从FragmentA转到FragmentF怎么办?之后是从FragmentFFragmentG吗?这就是我处理此问题的方式:从FragmentFFragmentG通知MainActivity我想更改片段。但是他们如何与MainActivity通信?为此,我在每个片段内部都有接口。 MainActivity实现这些接口。这是问题。 MainActivity实现了太多导致样板代码的接口。那么,浏览片段的最佳方法是什么?我什至没有碰触到我也需要处理后退按钮的操作:)

这是我的代码的样子:

MainActivity实现接口以在必要时更改片段:

class MainActivity : AppCompatActivity(), DashboardFragment.OnFragmentInteractionListener,
    PaymentFragment.BigCategoryChosenListener, PaymentSubcategoryFragment.ItemClickedListener, PayServiceFragment.OnPayServiceListener, ContactListFragment.ContactTapListener, P2PFragment.P2PNotifier

例如,这是我的PaymentFragment的onAttach方法:

@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通知活动以更改片段。我应该在 EACH 片段中这样做。我认为这不是最佳做法。那么,可以吗?还是有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

好吧,您需要在活动中像这样在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;
        }

});