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;
}

Android 如何动态改变Actionbar上的item图标的更多相关文章

  1. 动态改变actionbar上menu的图标

    工作中遇到了一个需求是,在滚动的时候让actionbar上的图标进行变色.实现后在这里总结下思路. 一.先在主题中定义好Actionbar的style <style name="App ...

  2. Android中动态改变控件的大小的一种方法

    在Android中有时候我们需要动态改变控件的大小.有几种办法可以实现  一是在onMeasure中修改尺寸,二是在onLayout中修改位置和尺寸.这个是可以进行位置修改的,onMeasure不行. ...

  3. Android ListView动态改变Item高度

    在adapter的getView方法中进行设置,代码如下 @Override public View getView(int position, View convertView, ViewGroup ...

  4. Android如果动态改变CursorAdapter Item个数

    //adapter内部类 private class SearchAdapter extends CursorAdapter { @Override public View newView(Conte ...

  5. [Android疑难杂症]动态改变Background后Padding无效的问题

    前言 在Layout中指定好background和padding以后,程序里面动态修改background之后padding就失效了,貌似是一个BUG,这里找到了一篇英文文章,简单翻译分享一下. 声明 ...

  6. Android中动态改变Listview中字体的颜色

    效果如下: 账目显示用的是Listview,要实现的功能为使其根据所在Item是“收入”还是“支出”来把数字设置成绿色或红色 方法是自定义适配器,并重写其中getView()函数,实现如下: //自定 ...

  7. Android实现动态改变屏幕方向(Landscape & Portrait)

    1.AndroidManifest.xml: <activity> android:screenOrientation="portrait" ... 2.xx.java ...

  8. Android中动态更新TextView上的文字

    示例代码: 1.新线程,定时更新文字 class testThread extends Thread{ public void run() { Message message = new Messag ...

  9. Android之动态改变控件大小

    利用getLayoutParams()方法和setLayoutParams()方法.三步曲:1.首先利用getLayoutParams()方法,获取控件的LayoutParams.eg:LayoutP ...

随机推荐

  1. ubuntu修改登录信息(本机和SSH登录)

    1.需要修改的主要文件和目录如下:/etc/issue/etc/motd/etc/update-motd.d//etc/issue.net 2.Ubuntu的登陆和欢迎信息控制主要在/etc/issu ...

  2. js 闭包 详解

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的特性 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数 ...

  3. js替换字符串的所有示例代码

    js如何替换字符串中所有. /** * 替换字符串中所有 * @param obj 原字符串 * @param str1 替换规则 * @param str2 替换成什么 * @return 替换后的 ...

  4. phpcms v9 自定义伪静态的分页函数

    因为.这个页面还没做好..等做好了..再给大家演示...... 调用方法:$page_attr=pages_open($num[0]['cun'],$get_page,$max_page,'http: ...

  5. PhantomJS实现最简单的模拟登录方案

    以前写爬虫,遇到需要登录的页面,一般都是通过chrome的检查元素,查看登录需要的参数和加密方法,如果网站的加密非常复杂,例如登录qq的,就会很蛋疼 在后面,有了Pyv8,就可以把加密的js文件扔给它 ...

  6. Nodejs & Mongod

    http://cwbuecheler.com/web/tutorials/2013/node-express-mongo/

  7. ^M的前世今生

    ^M 是ascii中的'\r', 回车符,是16进制的0x0D,8进制的015,十进制的13. 回想计算机发展,旧的打字机使用两个字符来开始一个新行.首先是一个字符命令使打印头移回开始位置(回车),然 ...

  8. iOS 基础 第四天(0809)

    0809 - 内存管理,只对oc对象生效. alloc.retain.release.retainCount 局部变量是放在栈里面的,oc对象是放在堆里面的.栈里面的内容系统自动回收,而堆里面的内容还 ...

  9. 【BZOJ1500】[NOI2005]维修数列

    Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...

  10. c# 赋值后最后一项数据部分丢失

    赋值,赋值后 原因,在添加后立即调用clear()清除数据....