最常見的是我們app的主頁面是由Viewpager嵌套Fragment葡盗,但當(dāng)我們需要在顯示不同F(xiàn)rragment的時候,Toolbar上的Menu也要隨之改變桃煎,我們總不能寫三個Toolbar跟三個Menu文件來實現(xiàn)吧组底,這樣也太low了。
那么怎么樣才能實現(xiàn)起來簡單能弊添,辦法肯定是有的,我們可不可以在Activity初始化的時候就把我們所要展示的所有Menu給初始化了捌木,然后我們再通過監(jiān)聽Viewpager的滑動頁面來對Menu進(jìn)行顯示隱藏呢油坝?沒錯,就是這個思路。這樣我們就只需布局一個Toolbar跟一個Menu文件即可免钻,豈不快哉!
我們知道初始化Menu的常用兩方法是onCreateOptionsMenu(Menu menu)
與onOptionsItemSelected(MenuItem item)
前一個是創(chuàng)建Activity是回調(diào)方法用于填充Menu的布局崔拥,只會執(zhí)行一次极舔,后面的方法是我們處理Menu的item點擊事件的,這些比較常用就不過多介紹了链瓦。下面我要介紹的方法是onPrepareOptionsMenu(Menu menu)
拆魏,該方法每顯示一次或調(diào)起一次Menu都會回調(diào)該方法,這就是我們實現(xiàn)該需求的關(guān)鍵方法慈俯,我們可以在該方法中實現(xiàn)Menu顯示隱藏的邏輯渤刃,再通過invalidateOptionsMenu()
方法去刷新Menu從而回調(diào)onPrepareOptionsMenu(Menu menu)
,這就達(dá)到了我們想要的效果贴膘。
上面圖片的布局及Menu文件都很簡單卖子,因此省略。下面是Activiy里面的詳細(xì)代碼:
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簡單使用