如何即时删除菜单项?

时间:2018-10-31 21:24:38

标签: java android

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

4 个答案:

答案 0 :(得分:1)

有几种选择:

  1. 最方便的选择:在您的build.gradle文件中创建2种不同的产品口味

    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()

答案 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。