2011-07-22 48 views
9

如何在运行时更改android 2.3.3中的选项菜单?我有两个XML菜单,需要在运行时切换菜单类型。运行时更改菜单

我想销毁或更新菜单,然后当用户按下菜单按钮时,再次调用onCreateOptions菜单选择适当的xml菜单。

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    if(OPTIONS_TYPE == 0) // Photo option 
     getMenuInflater().inflate(R.menu.photomenu, menu); 
    else // Photo + delete option 
     getMenuInflater().inflate(R.menu.photodeletemenu, menu); 

    return super.onCreateOptionsMenu(menu); 
} 
+0

我没有看到你的代码的问题...应该工作...,也许问题在你的XML文件? – Jim

+0

检查你的两个XML文件,也许有相同的?你认为你的代码不工作... – Jim

+0

但onCreateOptionsMenu只被调用一次。即当用户首先按下选项按钮 – Arcadia

回答

7

onCreateOptionsMenu只被调用一次。有可能是一个黑客工具,可以让你删除的选项菜单,但对其进行修改后,这一呼吁是从Android文档如下的标准方法,注意,它说:“一定要”

在运行时更改菜单项

一旦活动被创建,onCreateOptionsMenu()方法只被调用一次,如上所述。系统会保留并重新使用您在此方法中定义的菜单,直到您的活动被破坏。如果您想在第一次创建后的任何时候更改选项菜单,您必须重写onPrepareOptionsMenu()方法。

文档是Creating Menus

现在不得不说,你可以这样做,只是不知道如果它的支持。这只是我自己的测试代码,我每次换菜单,你将需要添加自己的逻辑

@Override 
public boolean onPrepareOptionsMenu (Menu menu) { 

    menu.clear(); 

    if (OPTIONS_TYPE == 0) { 
     OPTIONS_TYPE = 1; 
     getMenuInflater().inflate(R.menu.secondmenu, menu); 

    } 
    else { // Photo + delete option { 
     OPTIONS_TYPE = 0; 
     getMenuInflater().inflate(R.menu.firstmenu, menu); 
    } 

    return super.onPrepareOptionsMenu(menu); 
} 
+0

是啊我读过这..但我在onPrepareOptionsMenu做什么? – Arcadia

+1

我的意思是我不能使用invalidateOptionsMenu(),因为这只适用于android 3.0及更高版本;( – Arcadia

+0

)这个问题已解决。我通过重写onPrepareOptionsMenu()来解决它,调用menu.clear(),然后粘贴代码onCreateOptionsMenu :) – Arcadia