尚拙

一个分享技术、学习成长的个人博客网站

0%

Toolbar 动态改变 Menuitem 的两种方式

Android 的 app 主页,一般都是 ViewPager + Fragment 的方式,不同的 Fragment 有时需要不同的 Toolbar 的菜单。

方式一:使用 ActionMenuView

1、在布局文件中把 ActionMenuView 当作 ToolBar 的子 View

<androidx.appcompat.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<androidx.appcompat.widget.ActionMenuView
android:id="@+id/menu_view"
android:layout_gravity="right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

</androidx.appcompat.widget.Toolbar>

2、在 Activity 代码根据需求添加 menu 和移除 menu

ActionMenuView actionMenuView = (ActionMenuView) findViewById(R.id.menu_view);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
switch (position){
case 0:
mMenuView.getMenu().clear();
getMenuInflater().inflate(R.menu.todayonhistory_menu,mMenuView.getMenu());
break;
case 1:
mMenuView.getMenu().clear();
break;
case 2:
mMenuView.getMenu().clear();
getMenuInflater().inflate(R.menu.nav_test_menu,mMenuView.getMenu());
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});

方式二:使用 onPrepareOptionsMenu() + invalidateOptionsMenu()

1、在 Activity 正常加载菜单文件,重写 onCreateOptionsMenu() 方法

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.nav_test_menu,menu);
return true;
}

2、重写 onPrepareOptionsMenu() 方法,控制menuitem的显示与隐藏

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// 动态设置ToolBar状态
switch (mViewPager.getCurrentItem()) {
case 0:
menu.findItem(R.id.test_one).setVisible(true);
menu.findItem(R.id.test_two).setVisible(false);
menu.findItem(R.id.test_three).setVisible(false);
break;
case 1:
menu.findItem(R.id.test_one).setVisible(false);
menu.findItem(R.id.test_two).setVisible(true);
menu.findItem(R.id.test_three).setVisible(false);
break;
case 2:
menu.findItem(R.id.test_one).setVisible(false);
menu.findItem(R.id.test_two).setVisible(false);
menu.findItem(R.id.test_three).setVisible(true);
break;
}
return super.onPrepareOptionsMenu(menu);
}

3、使用 invalidateOptionsMenu() 方法 Menu,即回调 onPrepareOptionsMenu()

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
invalidateOptionsMenu();
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}