簡體   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