Android 如何动态改变Actionbar上的item图标
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图标的更多相关文章
- 动态改变actionbar上menu的图标
工作中遇到了一个需求是,在滚动的时候让actionbar上的图标进行变色.实现后在这里总结下思路. 一.先在主题中定义好Actionbar的style <style name="App ...
- Android中动态改变控件的大小的一种方法
在Android中有时候我们需要动态改变控件的大小.有几种办法可以实现 一是在onMeasure中修改尺寸,二是在onLayout中修改位置和尺寸.这个是可以进行位置修改的,onMeasure不行. ...
- Android ListView动态改变Item高度
在adapter的getView方法中进行设置,代码如下 @Override public View getView(int position, View convertView, ViewGroup ...
- Android如果动态改变CursorAdapter Item个数
//adapter内部类 private class SearchAdapter extends CursorAdapter { @Override public View newView(Conte ...
- [Android疑难杂症]动态改变Background后Padding无效的问题
前言 在Layout中指定好background和padding以后,程序里面动态修改background之后padding就失效了,貌似是一个BUG,这里找到了一篇英文文章,简单翻译分享一下. 声明 ...
- Android中动态改变Listview中字体的颜色
效果如下: 账目显示用的是Listview,要实现的功能为使其根据所在Item是“收入”还是“支出”来把数字设置成绿色或红色 方法是自定义适配器,并重写其中getView()函数,实现如下: //自定 ...
- Android实现动态改变屏幕方向(Landscape & Portrait)
1.AndroidManifest.xml: <activity> android:screenOrientation="portrait" ... 2.xx.java ...
- Android中动态更新TextView上的文字
示例代码: 1.新线程,定时更新文字 class testThread extends Thread{ public void run() { Message message = new Messag ...
- Android之动态改变控件大小
利用getLayoutParams()方法和setLayoutParams()方法.三步曲:1.首先利用getLayoutParams()方法,获取控件的LayoutParams.eg:LayoutP ...
随机推荐
- 使用UDP进行数据发送的实例一
首先如果TCP学过以后,再看UDP进行数据传输也是大同小异的,只是用到的类不同 UDP进行传输需要DataSocket和Datapacket类,Datapacket叫数据报,每一个数据报不能大于64k ...
- Google的小秘密
google有计算器的功能,例如在google中搜索25*25.lg(13)等,看会出现什么样的结果. http://www.google.com/microsoft 微软风格的入口 http: ...
- tomcat使用memcached完成集群
一.安装memcached 1.windows下安装memcached 需要到一个网站下载memcached的for win 32版本.在memcached的官方网站我是找不到的.我看了下,提供win ...
- 在PHP中如何使用消息列队
/** * 消息列队服务 * @author zhou.tingze * @example * -----------------------------------Create----------- ...
- 获取JAVA对象占用的内存大小
介绍两种获取JAVA对象内存大小的方法. 第一种:Instrumentation 简介: 使用java.lang.instrument 的Instrumentation来获取一个对象的内存大小.利用I ...
- wampsever在win10中安装扩展掉坑
1.必须要退出wampserver 2.php pecl + 3.wampserver 64 3.0.6
- Pandas简易入门(二)
目录: 处理缺失数据 制作透视图 删除含空数据的行和列 多行索引 使用apply函数 本节主要介绍如何处理缺失的数据,可以参考原文:https://www. ...
- 2016 系统设计第一期 (档案一)MVC ajax 获取json数据
我在做一张表的增删改查的时候,在编辑的时候,需要获取当前选择行对应的Id,然后并且把选择行的Id的对于的数据取出来,代码如下: 列表a标签绑定: Js代码: url: '/Users/GetUserB ...
- python学习笔记13(模块、包)
在Python中有一个概念叫做模块(module),比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块. 模块文件以.py后缀结 ...
- collectionView代码创建
@interface ViewController ()<UICollectionViewDataSource,UICollectionViewDelegateFlowLayout> @p ...