代码之家  ›  专栏  ›  技术社区  ›  Sharon

如何快速删除菜单项?

  •  -1
  • Sharon  · 技术社区  · 7 年前

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

    我也试着从菜单中删除项目,而不是隐藏它;调试器显示该项已被删除,但在显示菜单时仍会显示该项。

    如何隐藏/删除此项目?

    编辑

    我用一个导航抽屉来放菜单。在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();
    

    我怀疑这会以某种方式绕过PrepareOptions菜单等?有没有办法添加一个在单击“打开导航抽屉”按钮时调用的侦听器?我只能找到正在打开或关闭的抽屉的回调,它们会在抽屉移动后调用-我需要在之前调用它们。

    4 回复  |  直到 7 年前
        1
  •  1
  •   forpas    7 年前

    你可以在家里做 onCreate() 您的活动:

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    Menu navMenu = navigationView.getMenu();
    navMenu.removeItem(R.id.action_acc_upgrade);
    

    代替 nav_view 用你的 NavigationView

        2
  •  1
  •   punchman    7 年前

    有几种选择:

    1. 最方便的选择:在您的产品中创建两种不同的产品口味 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() .

        3
  •  1
  •   navylover    7 年前

    你应该重写 onPrepareOptionsMenu 这样地:

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        if(isPaid()) {
           menu.findItem(R.id.action_settings).setVisible(false);
        }
    }
    

    注意: 回调,例如 onCreate() onResume()

        4
  •  1
  •   Aaron    7 年前

    在飞行中 ,您需要覆盖 onPrepareOptionsMenu 打电话给我 invalidateOptionsMenu 如适用:

    @Override public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        menu.findItem(R.id.action_acc_upgrade).setVisible(!isPaid());
    }
    

    看到了吗 Activity.onPrepareOptionsMenu :

    使用此方法可以有效地启用/禁用项目或其他 动态修改内容。