2012-05-14 57 views
34

在我的活動的一些方法中,我想檢查菜單的標題或知道它是否被選中。我怎樣才能得到活動的菜單。我需要像this.getMenu()如何獲取我的活動的選項菜單?

+1

「Name」和「Checked」?我不明白。 ID和偏好? – keyser

+0

你在說選項菜單嗎?就像在「public boolean onCreateOptionsMenu(Menu menu)」中創建的一樣? – MikeIsrael

+0

是選項菜單 – breceivemail

回答

90

請謹慎對待invalidateOptionsMenu()。它重新創建整個菜單。這有很多開銷,並會重置像SearchView這樣的嵌入式組件。我花了很長時間才找到爲什麼我的SearchView會「隨機」關閉。

我最終捕獲了Dark發佈的菜單,然後根據需要調用onPrepareOptionsMenu(Menu)。這符合我的要求,沒有令人討厭的副作用。陷阱:確保在創建菜單之前撥打onPrepareOptionsMenu()進行空檢查。我做了如下:

private Menu mOptionsMenu; 

@Override 
public boolean onCreateOptionsMenu(final Menu menu) { 
    mOptionsMenu = menu 
    ... 
} 

private void updateOptionsMenu() { 
    if (mOptionsMenu != null) { 
     onPrepareOptionsMenu(mOptionsMenu); 
    } 
} 
+6

這是一個很好的答案,我想幫你達到50. :-) –

+0

真棒的答案,由於某種原因,我無法弄清楚哪個菜單傳遞給onPrepareOptionsMenu( ),因爲我想根據僅在服務啓動時發生的情況等來更改它等。無論如何, –

+0

我會同意,如果使用'invalidateOptionsMenu()',開銷會有點太大和非常明顯。我寧願這個解決方案使用較少的工作量。 –

1

有幾個回調方法,提供菜單作爲參數。

你可能想在那裏操縱它。

例如:

onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 
onCreateOptionsMenu(Menu menu) 
onCreatePanelMenu(int featureId, Menu menu) 

有幾個,最好你把活動文件中一看,尋找您想要的方式: http://developer.android.com/reference/android/app/Activity.html

+0

在您的解決方案中的值不是最新的 – breceivemail

+0

不知道確切的行爲,但您認爲將參考保存在字段變量中會做到這一點嗎?像:onCreateOptionsMenu(菜單菜單){this.menu =菜單。 。 。 。並訪問它以後要求標題? – Ostkontentitan

1

至於我能理解你想要的這裏是它可以幫助你:

1.請參閱本教程通過option menu

2.每次用戶按下菜單按鈕,您都可以通過getTitle()查看它的標題。

3.或者,如果您想知道用戶未按下菜單按鈕時選中或選擇的最後一個菜單項,則需要在用戶按下時存儲首選項。

11

,你可以通過將菜單對象到您的Activity類

public class MainActivity extends Activity 
{ 
    ... 
    ... 
    private Menu _menu = null; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     _menu = menu; 
     return true; 
    } 

    private Menu getMenu() 
    { 
     //use it like this 
     return _menu; 
    } 
} 
+1

調用invalidateOptionsMenu()更好!你只需要在onPrepareOptionsMenu(菜單菜單)中提供你的更新。 – AntoineP

27

呼叫invalidateOptionsMenu(),而不是通過周圍的菜單對象做到這一點。

+4

不幸的是,添加在API級別11 :( – greg7gkb

相關問題