[英]How do I remove a menu item on the fly?
我的Android应用程序有一个带菜单的导航抽屉。 在该应用程序的免费版本中,我想要一个菜单项,以允许用户升级到付费版本。 显然,我不希望在付费版本中使用此功能。
如何在付费版本中隐藏菜单项?
菜单如下所示:
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_home"
android:icon="@drawable/btn_home"
android:title="@string/nav_home"
/>
<item
android:id="@+id/action_acc_upgrade"
android:icon="@drawable/ic_star_black"
android:title="@string/str_acc_upgrade" />
<item
android:id="@+id/action_help"
android:icon="@drawable/ic_help_black"
android:title="@string/nav_help"
/>
</menu>
在活动中,我有:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.activity_main_drawer, menu);
if(isPaid()) {
MenuItem upgrade = menu.findItem(R.id.action_acc_upgrade);
upgrade.setVisible(false);
}
return true;
}
如果我通过调试运行它,它到达线if(isPaid())
然后计算它为真,那么进入调用setVisible部分。 但是,该项目仍显示在菜单中。
我还尝试过从菜单中删除该项目,而不是隐藏它。 调试器显示该项目已删除,但是在显示菜单时它仍然显示。
如何隐藏/删除该物品?
我正在使用导航抽屉保存菜单。 这是在onCreate中设置的,如下所示:
// Set up toolbar
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Set up navigation drawer
DrawerLayout drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.nav_drawer_open, R.string.nav_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
我怀疑这以某种方式绕过了onPrepareOptionsMenu等? 有没有添加单击“打开导航抽屉”按钮时调用的侦听器的方法? 我只能找抽屉回调被打开或关闭,而他们是所谓的抽屉移动后 - 我需要之前给他们打电话。
有几种选择:
最方便的选择:在build.gradle
文件中创建2种不同的产品build.gradle
productFlavors { free { ... } paid { ... } }
然后覆盖菜单文件中没有action_acc_upgrade
项的付费风味。
如果要以编程方式更改可见性,请尝试使用onPrepareOptionsMenu
而不是onCreateOptionsMenu
:
@Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); if(isPaid()) { MenuItem upgrade = menu.findItem(R.id.action_acc_upgrade); upgrade.setEnabled(false); upgrade.setVisible(false); } }
如果在创建后需要更改菜单,请调用invalidateOptionsMenu()
。
如果它是在飞行中 ,你需要重写onPrepareOptionsMenu
并调用invalidateOptionsMenu
(如果适用):
@Override public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
menu.findItem(R.id.action_acc_upgrade).setVisible(!isPaid());
}
参见Activity.onPrepareOptionsMenu :
准备要显示的屏幕标准选项菜单。 在显示菜单之前,每次显示菜单时都会调用此方法。 您可以使用此方法有效地启用/禁用项目,或者以其他方式动态修改内容。
您应该像这样重写onPrepareOptionsMenu
:
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if(isPaid()) {
menu.findItem(R.id.action_settings).setVisible(false);
}
}
注意:确保在onPrepareOptionsMenu
回调之前获得正确的isPaid()值,例如在onCreate()
或onResume()
。
您可以在活动的onCreate()
中执行此操作:
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
Menu navMenu = navigationView.getMenu();
navMenu.removeItem(R.id.action_acc_upgrade);
将nav_view
替换为NavigationView
的ID。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.