2010-11-16 58 views
41

我的Activity上有一個選項菜單,其中MenuItem「開始」。當選擇MenuItem時,我想更改菜單,使其包含MenuItem「停止」。最後,當選擇「停止」時,我想回到「開始」。如何在Android的選項菜單上更改MenuItem?

這是我的代碼不工作的部分。我有兩個「開始」和「停止」,在mymenu.xml列出我也許應該刪除「停止」創建菜單時:

public class MyActivity extends Activity { 
    private boolean isStarted = false; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     menu.removeItem(R.id.stop); 
     inflater.inflate(R.menu.mymenu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.start: 
      isStarted = true; 
      return true; 
     case R.id.stop: 
      isStarted = false; 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     if(isStarted) { 
      menu.removeItem(R.id.start); 
      menu.add(R.id.stop); 
     } else { 
      menu.removeItem(R.id.stop); 
      menu.add(R.id.start); 
     } 
     return true; 
    } 
} 
+1

當菜單創建時,您是否已嘗試刪除「停止」?代碼看起來不錯。我找不到任何會導致除此之外的問題。 – 2010-11-16 22:40:01

+0

@Octavian:我嘗試'menu.removeItem(R.id.stop);''get'enMenuInflater();'之後',但它不起作用。我要麼得到兩個菜單項,一個「開始」和一個「假」(應該是「停止」),或者當我應該顯示時菜單崩潰。 – Jonas 2010-11-16 22:44:21

+1

你要在哪裏調用'removeItem()'?在'onPrepareOptionsMenu()'? – 2010-11-16 22:46:31

回答

94

對於這種類型的操作,我通常選擇不改變菜單項,但只是隱藏那些你不需要:

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 
    menu.findItem(R.id.start).setVisible(!isStarted); 
    menu.findItem(R.id.stop).setVisible(isStarted); 
    return true; 
} 
+0

剛纔看到我忘記調用超類,正如之前所建議的,並在[docs](http:// developer。android.com/reference/android/app/Activity.html#onPrepareOptionsMenu%28android.view.Menu%29)和[來源](http://www.google.com/codesearch/p?hl=zh-CN#uX1GffpyOZk/ core/java/android/app/Activity.java&d = 3&l = 2272) – Flygenring 2011-03-17 00:45:15

+0

爲了更新,可以在http://grepcode.com/file/repository.grepcode.com/java/ext/com找到源代碼。 google.android/android/2.3_r1/android/app/Activity.java?av=f#2272 – Flygenring 2013-04-09 11:01:33

6

你可能需要調用super.onPrepareOptionsMenu您完成更改後。從docs

派生類,應該總是調用 通過基類 實現。

+0

+1即使不是解決方案,也能提供正確答案。 – 2010-11-16 23:12:16

3

我得到了解決方案。您在撥打removeItem()時基本上刪除MenuItem,因此也會刪除參考。使用此代碼的作品。

private boolean isStarted = false; 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case 1: 
     isStarted = true; 
     return true; 
    case 0: 
     isStarted = false; 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 

    if(isStarted) { 
     menu.removeItem(1); 
     menu.add(0, 0, 0, "Stop"); 
    } else { 
     menu.removeItem(0); 
     menu.add(0, 1, 0, "Start"); 
    } 

    return super.onPrepareOptionsMenu(menu); 
} 

您必須再次創建MenuItem。這也是false標籤的原因。其實你不需要MenuInflater,因爲你通過代碼創建Menu,所以也不需要任何菜單的XML文件。

20

Flygenring答案是正確的,但menu.findItem( )是laggy,並將其稱爲onPrepareOptionsMenu(菜單菜單)產生不良的用戶體驗。這是更好地得到菜單項對象一旦在創建菜單,然後只需調用調用setVisible菜單在屏幕上occures每次:

MenuItem mDynamicMenuItem; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     // Get dynamic menu item 
     mDynamicMenuItem = menu.findItem(R.id.menu_item); 
     return true; 
    } 

    // Prepare the Screen's standard options menu to be displayed. This is called right 
    // before the menu is shown, every time it is shown. You can use this method to 
    // efficiently enable/disable items or otherwise dynamically modify the contents. 
    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 
     // Here is just a good place to update item 
     mDynamicMenuItem.setVisible(isVisible); 
     return true; 
    } 
1

感謝在這個職位的信息,因爲它解決了我的假標籤的問題,在我的菜單。我不得不稍微修改它,並且最終的代碼運行良好,如下所示,希望它能夠節省一些時間和挫敗感。它有一個稍微不同的解決方案,但我做的主要變化是.setVisible爲True或False,除了i.shadrins解決方案最適合我的需求。

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

    if(loggedIn) 
    { 
     logIn.setVisible(false); 
     logOut.setVisible(true); 
    } 
    else 
    { 
     logIn.setVisible(true); 
     logOut.setVisible(false); 
    } 
    return true; 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    logIn = menu.findItem(R.id.loggedOut); 
    logOut = menu.findItem(R.id.loggedIn); 
    return true; 
} 
+0

它應該放在哪個文件中? – 2018-01-08 00:43:15