2012-07-07 34 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