2010-11-16 32 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

相关问题