繁体   English   中英

如何即时删除菜单项?

[英]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等? 有没有添加单击“打开导航抽屉”按钮时调用的侦听器的方法? 我只能找抽屉回调被打开或关闭,而他们是所谓的抽屉移动后 - 我需要之前给他们打电话。

有几种选择:

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

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

如果它是在飞行中 ,你需要重写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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM