简短的问题:
我有一个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
例如,这是我的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 片段中这样做。我认为这不是最佳做法。那么,可以吗?还是有更好的方法呢?
答案 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;
}
});