1.Activity菜单机制 (与dialog类似)
Activity有一套机制来实现对菜单的管理,方法如下:
1.public boolean onCreateOptionsMenu(Menu menu)
此方法用于初始化菜单,其中menu参数就是即将要显示的Menu实例。
返回true则显示该menu,false 则不显示;
(只会在第一次初始化菜单时调用)
2.public boolean onPrepareOptionsMenu(Menu menu)
在onCreateOptionsMenu执行后,菜单被显示前调用;如果菜单已经被创建,则在菜单显示前被调用。
同样的, 返回true则显示该menu,false 则不显示;
(可以通过此方法动态的改变菜单的状态,比如加载不同的菜单等,在onCreateOptionsMenu调用之后调用)
3.public void onOptionsMenuClosed(Menu menu)
每次菜单被关闭时调用.
(菜单被关闭有三种情形,menu按钮被再次点击、back按钮被点击或者用户选择了某一个菜单项)
4.public boolean onOptionsItemSelected(MenuItem item)
菜单项被点击时调用,也就是菜单项的监听方法。
通过这几个方法,可以得知,对于Activity,同一时间只能显示和监听一个Menu 对象。
但是这个onCreateOptionsMenu在activity的整个周期中只被调用一次,之后都不会变化,于是在android的较新版本里有了onPrepareOptionsMenu方法。
onCreateOptionsMenu方法是不能动态加载菜单的,因为他只调用了一次,你可以换onPrepareOptionsMenu这个方法来获取,他每次点击菜单都会调用。
由上面分析可知道,我们可以在onPrepareOptionsMenu里面改变item,但是如何实现在想改变Menu 的item的时候调用onPrepareOptionsMenu呢?
解决的办法是在你要更新菜单项的地方加上:
mActivity.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
这个是原生actionbar的解决办法,如果你用的是 ActionBarSherlock,那么调用
invalidateOptionsMenu();
/* * * 当文章刷新时候,如果赞过了显示ic_menu_fav_pressed图标 */ @Override public boolean onPrepareOptionsMenu(Menu menu) { System.out.println("执行了onPrepareOptionsMenu"); if (collectionDB.isHasArtivle(article.getId())) { menu.findItem(R.id.action_fav).setIcon( R.drawable.ic_menu_fav_pressed); menu.findItem(R.id.action_fav).setCheckable(false); } else { menu.findItem(R.id.action_fav).setIcon(R.drawable.ic_menu_fav); menu.findItem(R.id.action_fav).setCheckable(true); } // getSupportMenuInflater().inflate(R.menu.book_detail, menu); return super.onPrepareOptionsMenu(menu); } @Override public boolean onCreateOptionsMenu(Menu menu) { System.out.println("执行了onCreateOptionsMenu"); getSupportMenuInflater().inflate(R.menu.book_detail, menu); return true; }