因此,我的應用程序中有此工具欄,並且我想根據用戶是否登錄顯示不同的菜單項。當用戶登錄或註銷時,我想更新我的佈局,現在是用於表示更改的工具欄菜單。不過,出於某種原因,我的菜單項根本不會被刪除,無論登錄狀態如何,它們都始終可見。更改從xml佈局製作的工具欄菜單上的菜單項
我的菜單項:
<menu
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_add"
android:icon="@drawable/ic_action_add"
android:title="@string/action_add"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_login"
android:icon="@drawable/ic_action_logged_out"
android:title="@string/action_log_in"
app:showAsAction="always"/>
<item
android:id="@+id/action_logout"
android:icon="@drawable/ic_action_logged_in"
android:title="@string/action_log_out"
app:showAsAction="always"/>
</menu>
第一個菜單項是隻應該是已登錄用戶可見此外,我想這是自我解釋,但我只希望在日誌的一個輸入/輸出。取決於登錄狀態,按鈕是可見的。
我的Java代碼:
protected void initializeToolbar(){
myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
menu = myToolbar.getMenu();
resetToolbarMenu();
myToolbar.setOnMenuItemClickListener(this);
}
private void resetToolbarMenu(){
menu.clear();
getMenuInflater().inflate(R.menu.menu, menu);
if(loginPrefs.getBoolean("login", false)) { //loginPrefs is reference to a SharedPreference object
menu.removeItem(1);
} else {
menu.removeItem(2);
menu.removeItem(0);
}
}
原因我有兩種方法,我只是想設置工具欄和偵聽一次,但我希望能夠每一次改變菜單的用戶登錄/ out,無需重新加載頁面。
成功登錄後,將再次調用resetToolbarMenu()
方法。
我猜想menu.remove(0)
不更新的用戶界面,但我無法找到另一種方式,而不先膨脹,然後從工具欄得到它達到我的菜單對象,我認爲通脹是什麼決定什麼項目都可見。基本上,我無法找到一種方式來刪除任何菜單項,然後以另一種方式膨脹或更新UI。
解決方案:
我改變了我的Java代碼弄成這個樣子:
protected void initializeToolbar(){
myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu); // Don't know if this is necessary or if returning true is prefered.
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if(loginPrefs.getBoolean("login", false)) {
menu.getItem(0).setVisible(true);
menu.getItem(1).setVisible(false);
menu.getItem(2).setVisible(true);
} else {
menu.getItem(0).setVisible(false);
menu.getItem(1).setVisible(true);
menu.getItem(2).setVisible(false);
}
return true;
}
我也只好打電話invalidateOptionsMenu()
上註銷/登錄更新工具欄/菜單。但是,無論何時打開工具欄上未顯示的項目的菜單,onPrepareOptionsMenu()也會自動調用。
PS:OnCreateOptionsMenu
和OnPrepareOptionsMenu
將不會被使用,除非您記得我忘了setSupportActionBar(myToolbar)
。
我正在尋找比靜態定義兩種佈局更動態的東西。如果我已經在活動增加新的東西,我不想任何顯示添加項目,這將使其成爲4個不同的XML文件,而不是2,肯定能查這個事情OptionsMenu不過。 – Chexxor
動態菜單的相同方法。您需要使用menu.add在onCreateOptionsMenu中創建菜單,而不是膨脹靜態佈局。並強制重繪使用invalidateOptionsMenu – tompee
嗯。這將迫使我以編程方式定義菜單項目,看起來像?有沒有辦法來加載XML菜單作爲一個對象,然後通過使用menu.remove(INT)後,該對象膨脹? – Chexxor