首页 > 解决方案 > 如何即时删除菜单项?

问题描述

我的 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 等?有没有办法添加在单击“打开导航抽屉”按钮时调用的侦听器?我只能找到打开或关闭抽屉的回调,并且在抽屉移动后调用它们 - 我需要在之前调用它们。

标签: javaandroid

解决方案


有几种选择:

  1. 最方便的选择:在您的build.gradle文件中创建 2 个不同的 productFlavours

    productFlavors {
        free {
          ...
        }
        paid {
          ...
        }
    }
    

    然后覆盖您的菜单文件而没有action_acc_upgrade付费风味的项目。

  2. 如果您想以编程方式更改可见性,请尝试使用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().


推荐阅读