2011-07-22 122 views
9

如何在運行時更改android 2.3.3中的選項菜單?我有兩個XML菜單,需要在運行時切換菜單類型。運行時更改菜單

我想銷燬或更新菜單,然後當用戶按下菜單按鈕時,再次調用onCreateOptions菜單選擇適當的xml菜單。

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    if(OPTIONS_TYPE == 0) // Photo option 
     getMenuInflater().inflate(R.menu.photomenu, menu); 
    else // Photo + delete option 
     getMenuInflater().inflate(R.menu.photodeletemenu, menu); 

    return super.onCreateOptionsMenu(menu); 
} 
+0

我沒有看到你的代碼的問題...應該工作...,也許問題在你的XML文件? – Jim

+0

檢查你的兩個XML文件,也許有相同的?你認爲你的代碼不工作... – Jim

+0

但onCreateOptionsMenu只被調用一次。即當用戶首先按下選項按鈕 – Arcadia

回答

7

onCreateOptionsMenu只被調用一次。有可能是一個黑客工具,可以讓你刪除的選項菜單,但對其進行修改後,這一呼籲是從Android文檔如下的標準方法,注意,它說:「一定要」

在運行時更改菜單項

一旦活動被創建,onCreateOptionsMenu()方法只被調用一次,如上所述。系統會保留並重新使用您在此方法中定義的菜單,直到您的活動被破壞。如果您想在第一次創建後的任何時候更改選項菜單,您必須重寫onPrepareOptionsMenu()方法。

文檔是Creating Menus

現在不得不說,你可以這樣做,只是不知道如果它的支持。這只是我自己的測試代碼,我每次換菜單,你將需要添加自己的邏輯

@Override 
public boolean onPrepareOptionsMenu (Menu menu) { 

    menu.clear(); 

    if (OPTIONS_TYPE == 0) { 
     OPTIONS_TYPE = 1; 
     getMenuInflater().inflate(R.menu.secondmenu, menu); 

    } 
    else { // Photo + delete option { 
     OPTIONS_TYPE = 0; 
     getMenuInflater().inflate(R.menu.firstmenu, menu); 
    } 

    return super.onPrepareOptionsMenu(menu); 
} 
+0

是啊我讀過這..但我在onPrepareOptionsMenu做什麼? – Arcadia

+1

我的意思是我不能使用invalidateOptionsMenu(),因爲這隻適用於android 3.0及更高版本;( – Arcadia

+0

)這個問題已解決。我通過重寫onPrepareOptionsMenu()來解決它,調用menu.clear(),然後粘貼代碼onCreateOptionsMenu :) – Arcadia