2012-07-07 59 views
7

使用onPrepareOptionsMenu代替onCreateOptionsMenu的我有一個問題在ActionBar設立一些片段菜單項和我找到了一種方法來解決這個問題,但我不明白爲什麼它的工作。在片段

我想改變的知名度菜單項之後我誇大它從菜單XML文件中onCreateOptionsMenu方法。該代碼似乎工作正常,但沒有明顯的影響。我解決了在onCreateOptionsMenu方法中擴大菜單的問題,但是在onPrepareOptionsMenu方法中改變了它的可見性。

我想知道的是爲什麼改變onCreateOptionsMenu知名度不工作。

我能做些什麼onPrepareOptionsMenu我不能在onCreateOptionsMenu做什麼?

這裏有什麼樣的模式嗎?

謝謝!

下面是相關的代碼,以防萬一:

public class MyFragment extends Fragment { 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     inflater.inflate(R.menu.my_menu, menu); 

     // This does not work, compiles and runs fine, but has no visible effect 
     MenuItem someMenuItem = menu.findItem(R.id.some_menu_item); 
     someMenuItem.setVisible(false); 
    } 

    @Override 
    public void onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 

     // This does work 
     MenuItem someMenuItem = menu.findItem(R.id.some_menu_item); 
     someMenuItem.setVisible(false); 
    } 
} 
+1

我不知道,但[文件](http://developer.android.com/reference/android/app/Activity。 html#onCreateOptionsMenu(android.view.Menu))說:「_ ...要每次顯示菜單時更新菜單,請參閱[onPrepareOptionsMenu(Menu)](http://developer.android.com/reference/android/app/ Activity.html#onPrepareOptionsMenu(android.view.Menu))._「 – 2012-07-07 15:02:07

+1

感謝您的評論! 這裏的東西是我不需要'每次顯示都更新它'(它一直顯示,沒有子菜單),我只想配置菜單一次,創建/膨脹時,這就是全部。好吧,在我的情況下看起來可能是一樣的,但我的問題的關鍵是要明白爲什麼它會像這樣工作。 爲什麼每次顯示菜單時都必須「重新配置」菜單,而只能在創建菜單時才執行一次菜單? – 2012-07-07 15:13:30

+0

我理解並同意應該是一個選項。但在我看來,我認爲這是Android的工作方式。在某些情況下,您可以使用xml屬性對菜單的屬性進行硬編碼。 – 2012-07-07 17:01:46

回答

5

你應該叫super.onCreateOptionsMenu(menu, inflater);您已經創建菜單之後,而不是之前。這會在層次結構和其他片段中發送菜單,或者活動可能需要自行添加項目。

活動負責顯示和管理菜單,所以如果你改變了知名度後,已發送到活動中,沒有什麼事情發生。

現在,當您撥打super.onPrepareOptionsMenu(menu);時,它將「準備」它的菜單,但它現在將考慮您在onCreateOptionsMenu中所做的更改。

+1

不錯 - 刪除這行,因爲你是對的「_I think that_」 – Elltz 2015-01-11 22:32:23

+0

完成 - 謝謝你的確認。 – Christian 2015-01-13 08:23:52

0

可能是代碼應返回true表示菜單可見,這意味着你應該把 return true;語句都onCreateOptionsMenu()onPrepareOptionsMenu()

希望這會有所幫助。

+5

onCreateOptionsMenu返回void – Axarydax 2013-09-22 18:00:18

+1

實際上,有兩個onPrepareOptions()方法。 Activity類的[first](http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu(android.view.Menu))確實會返回一個值 - 如果true不是返回,菜單不會顯示。 [Fragment](http://developer.android.com/reference/android/app/Fragment.html#onPrepareOptionsMenu(android.view.Menu))版本沒有。片段版本需要API 11與API版本1的活動版本。有趣的一種。 – fattire 2015-05-23 23:18:18

0

我用onPrepareOptionsMenu更新其菜單上的項目應該是積極的,哪些應根據活動的當前狀態爲灰色/刪除。使用菜單項的setVisible方法來控制當前是否顯示在菜單上。

-2

這對我的作品

public class ContentFragment extends android.support.v4.app.Fragment { 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.content_frame,container,false); 
    setHasOptionsMenu(true); 
    return v; 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.note_menu,menu); 
    super.onCreateOptionsMenu(menu, inflater); 
} 
} 

試試吧

+0

這個東西適用於我,但想知道如何使用invalidateoptionsmenu()方法進行動態更改 – 2016-06-20 13:03:48

+0

如果有關於動態菜單更新的任何代碼,請通知我。 – 2016-06-20 13:05:21