[英]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等? 有沒有添加單擊“打開導航抽屜”按鈕時調用的偵聽器的方法? 我只能找抽屜回調被打開或關閉,而他們是所謂的抽屜移動后 - 我需要之前給他們打電話。
有幾種選擇:
最方便的選擇:在build.gradle
文件中創建2種不同的產品build.gradle
productFlavors { free { ... } paid { ... } }
然后覆蓋菜單文件中沒有action_acc_upgrade
項的付費風味。
如果要以編程方式更改可見性,請嘗試使用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.