java - 如何即时删除菜单项?
问题描述
我的 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 等?有没有办法添加在单击“打开导航抽屉”按钮时调用的侦听器?我只能找到打开或关闭抽屉的回调,并且在抽屉移动后调用它们 - 我需要在之前调用它们。
解决方案
有几种选择:
最方便的选择:在您的
build.gradle
文件中创建 2 个不同的 productFlavoursproductFlavors { 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()
.
推荐阅读
- css - npm 与编译过程 sass cammand line
- postgresql - 如何在 PostgreSQL 中添加外键
- azure-pipelines - 为什么我需要在 CICD 管道中使用构建代理?
- r - 从R中的重复数据有条件地选择第n个obs
- java - 带有 Logback 的映射诊断上下文的类型化 JSON 输出
- linux - Busybox 重启对 buildroot Linux 没有影响
- azure-active-directory - 启用 Azure AD '需要用户分配',如何处理同一租户中的未经授权的用户
- apache-flink - Flink:我们应该使用什么来代替命令行选项'-yt'?
- python - 替换 NaN 值
- windows-terminal - 阻止 Windows 终端显示当前目录