我的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())
行,然后将其评估为true,因此进入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等?有没有添加单击“打开导航抽屉”按钮时调用的侦听器的方法?我只能找到正在打开或关闭的抽屉的回调,并且在抽屉移动后会调用它们-我需要在之前调用它们。
答案 0 :(得分:1)
有几种选择:
最方便的选择:在您的build.gradle
文件中创建2种不同的产品口味
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()
。
答案 1 :(得分:1)
如果运行中是 ,则需要覆盖onPrepareOptionsMenu
并致电invalidateOptionsMenu
(如果适用):
@Override public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
menu.findItem(R.id.action_acc_upgrade).setVisible(!isPaid());
}
请参见Activity.onPrepareOptionsMenu:
准备要显示的屏幕标准选项菜单。这是 在显示菜单之前,每次显示时调用。您可以 使用此方法有效地启用/禁用项目或其他 动态修改内容。
答案 2 :(得分:1)
您应像这样覆盖onPrepareOptionsMenu
:
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if(isPaid()) {
menu.findItem(R.id.action_settings).setVisible(false);
}
}
注意:
确保在onPrepareOptionsMenu
回调之前(例如在onCreate()
或onResume()
中获得正确的isPaid()值。
答案 3 :(得分:1)
您可以在活动的onCreate()
中进行以下操作:
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
Menu navMenu = navigationView.getMenu();
navMenu.removeItem(R.id.action_acc_upgrade);
将nav_view
替换为您的NavigationView
的ID。