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. 取消定时-CICS

    CICE CA R 做定时的时候最好加上REqID

  2. XML解析之PULL

    在Android中极力推荐的xmlpull方式解析xml. 为什么 STAX 解析方式 效率 好于 SAX ? 1.SAX 无选择性的,所有事件都会处理 解析方式,Stax 由用户控制需要处理事件类型 ...

  3. winForm 中子窗体关闭但不释放对象,方便下次继续打开

    方法一: 修改子窗体中自动生成的Dispose方法(在Form.Designer.cs文件中) /// <summary> /// Clean up any resources being ...

  4. python(三)一个文件读写操作的小程序

    我们要实现一个文件读写操作的小程序 首先我们有一个文件 我们要以"============"为界限,每一个角色分割成一个独立的txt文件,按照分割线走的话是分成 xiaoNa_1. ...

  5. 009.EscapeRegExChars

    类型:function 可见性:public 所在单元:RegularExpressionsCore 父类:TPerlRegEx 把转义字符变成原意字符 例如\d意为0~9某个数字,通过此函数转换后则 ...

  6. 九,WPF资源

    WPF资源的优点 WPF资源系统是一种保管一系列有用对象的简单方法,从而可以更容易地重用这些对象,它主要有以下优点: 高效,通过资源可以定义一个对象,并在标记中的多个地方重用,这会使代码变的更加精简, ...

  7. wpf 绑定失效的原因及解决方案

    有时候,您会发现在程序开始时还能正常运行的绑定失效了.就个人经验而言,绑定的失效主要分为两种情况:对于One-way绑定而言,如果软件开发人员绕过绑定直接更改了目标属性,那么绑定将会失效.而对于Two ...

  8. c语言背后的运行机制

    目的:通过分析c语言转换成汇编代码后的执行过程对汇编语言和X86构架有一个初步认识 实验代码 #include <stdio.h> int g(int x) { ; } int f(int ...

  9. Printer Queue

    Description The only printer in the computer science students' union is experiencing an extremely he ...

  10. 视网膜New iPad与普通分辨率iPad页面的兼容处理

    一.这是篇经验分享 就算不是果粉也应该知道,iPad2与new iPad的重大区别之一就是显示屏的分辨率.new iPad显示屏被称之为“视网膜显示屏”,其设备分辨比(之前有详细介绍,点击这里查看)是 ...