2011-05-17 35 views
2

我發現了一些困惑,我在這篇文章中 http://developer.android.com/guide/topics/ui/menus.html不同的行爲與方法onCreateOptionsMenu

下面是一段簡單的代碼和輸出 當我的Android 3.0

  1. 和2線系統上啓動應用程序創建活動後立即執行

當菜單被按下並且菜單項被選中時,打印3.和4.行

Probem是第5行和buttonHandler方法,該方法調用invalidateOptionsMenu();的調用 和結果是6號線和7

爲什麼系統onPrepareOptionsMenu即使他們寫

在Android 3.0之前調用onCreateOptionsMenu更高,你必須調用invalidateOptionsMenu()當你想更新菜單,因爲菜單總是打開的。系統然後會調用onPrepareOptionsMenu(),以便更新菜單項。

在這種情況下onCreateOptionsMenu被稱爲每次invalidateOptionsMenu(), 後,但是當我開始在Android 2.3 onCreateOptionsMenu應用程序被調用一次。

1 INFO/System.out的(382):onCreateOptionsMenu
2 INFO/System.out的(382):onPrepareOptionsMenu
3 INFO/System.out的(382):onPrepareOptionsMenu
4 INFO/System.out的( 382):onOptionsItemSelected
5 INFO/System.out的(382):buttonHandler
6 INFO/System.out的(382):onCreateOptionsMenu
7 INFO/System.out的(382):onPrepareOptionsMenu

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 

public boolean onCreateOptionsMenu(Menu menu) { 
    System.out.println("onCreateOptionsMenu"); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.game_menu, menu); 
    return true; 
} 

public boolean onPrepareOptionsMenu(Menu menu) { 
    System.out.println("onPrepareOptionsMenu"); 
    return super.onPrepareOptionsMenu(menu); 
} 

public boolean onOptionsItemSelected(MenuItem item) { 
    System.out.println("onOptionsItemSelected"); 
    return super.onOptionsItemSelected(item); 
} 

public void buttonHandler(View v){ 
    System.out.println("buttonHandler"); 
    invalidateOptionsMenu(); 
} 

回答

3

這可能是一個文檔錯誤。我希望onCreateOptionsMenu()invalidateOptionsMenu()之後被調用。

+0

在方法onCreateOptionsMenu()中midify菜單是否正確,或者我必須在方法invalidateOptionsMenu()中做到這一點? – user569890 2011-05-17 11:05:00

+2

@ user569890:在任何情況下,只需實現'onCreateOptionsMenu()'構建正確的菜單。當菜單改變時調用'invalidateOptionsMenu()'。 – CommonsWare 2011-05-17 11:10:23