最常见的是我们app的主页面是由Viewpager嵌套Fragment,但当我们需要在显示不同Frragment的时候,Toolbar上的Menu也要随之改变,我们总不能写三个Toolbar跟三个Menu文件来实现吧,这样也太low了。
那么怎么样才能实现起来简单能,办法肯定是有的,我们可不可以在Activity初始化的时候就把我们所要展示的所有Menu给初始化了,然后我们再通过监听Viewpager的滑动页面来对Menu进行显示隐藏呢?没错,就是这个思路。这样我们就只需布局一个Toolbar跟一个Menu文件即可,岂不快哉!
我们知道初始化Menu的常用两方法是onCreateOptionsMenu(Menu menu)
与onOptionsItemSelected(MenuItem item)
前一个是创建Activity是回调方法用于填充Menu的布局,只会执行一次,后面的方法是我们处理Menu的item点击事件的,这些比较常用就不过多介绍了。下面我要介绍的方法是onPrepareOptionsMenu(Menu menu)
,该方法每显示一次或调起一次Menu都会回调该方法,这就是我们实现该需求的关键方法,我们可以在该方法中实现Menu显示隐藏的逻辑,再通过invalidateOptionsMenu()
方法去刷新Menu从而回调onPrepareOptionsMenu(Menu menu)
,这就达到了我们想要的效果。
上面图片的布局及Menu文件都很简单,因此省略。下面是Activiy里面的详细代码:
public class MainActivity extends BaseActivity {
private List<Fragment> list = new ArrayList<>();
private int index = 0;
@InjectView(R.id.navigation)
BottomNavigationView navigation;
@InjectView(R.id.vp)
ViewPager vp;
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
index = 0;
reflushView();
return true;
case R.id.navigation_discover:
index = 1;
reflushView();
return true;
case R.id.navigation_talk:
index = 2;
reflushView();
return true;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
initView();
}
private void initView() {
setGestureFinishEnable(false);
finishOthersActivity();
setTitle("房间");
list.add(new RoomFragment());
list.add(new DiscoverFragment());
list.add(new TalkFragment());
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
vp.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
return list.get(position);
}
@Override
public int getCount() {
return list.size();
}
});
vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
index = position;
reflushView();
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
private void reflushView() {
vp.setCurrentItem(index);
navigation.getMenu().getItem(index).setChecked(true);
invalidateOptionsMenu();
switch (index){
case 0:
setTitle(R.string.bottom_title_room);
break;
case 1:
setTitle(R.string.bottom_title_discover);
break;
case 2:
setTitle(R.string.bottom_title_talk);
break;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem logout = menu.findItem(R.id.logout);
MenuItem deleteAll = menu.findItem(R.id.deleteAll);
switch (index){
case 0:
logout.setVisible(true);
deleteAll.setVisible(false);
break;
case 1:
logout.setVisible(false);
deleteAll.setVisible(false);
break;
case 2:
logout.setVisible(false);
deleteAll.setVisible(true);
break;
}
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.logout:
finishAllActivity();
System.exit(0);
break;
case R.id.deleteAll:
ProgressDialog.show(getCurrent());
break;
}
return super.onOptionsItemSelected(item);
}
}
如果有朋友对BottomNavigationView不熟悉的话,可以查看我的BottomNavigationView简单使用