Android 的 app 主页,一般都是 ViewPager + Fragment 的方式,不同的 Fragment 有时需要不同的 Toolbar 的菜单。
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) { } });
|
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) { } }); }
|