工作中遇到了一个需求是,在滚动的时候让actionbar上的图标进行变色。实现后在这里总结下思路。

一、先在主题中定义好Actionbar的style

 <style name="AppTheme" parent="BaseTheme">

        <item name="actionBarStyle">@style/NAActionBarStyle</item>
<item name="actionBarSize">@dimen/actionbar_height</item>
<item name="actionBarItemBackground">@drawable/action_bar_selector</item> <item name="actionOverflowButtonStyle">@style/MyOverFlow.Dark</item>
<item name="homeAsUpIndicator">@drawable/action_bar_icon_back_dark</item> </style>

二、分区域进行改变

2.1 改变最左边的返回按钮

getSupportActionBar().setHomeAsUpIndicator(R.drawable.action_bar_icon_back_light);

2.2 改变文字的颜色和透明度

这个比较复杂,首先要定义这样一个类:

package com.duitang.main.util;

import android.graphics.Color;
import android.os.Parcel;
import android.support.annotation.NonNull;
import android.text.TextPaint;
import android.text.style.ForegroundColorSpan; /**
* Created by YlorD on 14-12-16.
* @author YlorD
* @since v3.7
* from Cyril Mottier
*/
public class AlphaForegroundColorSpan extends ForegroundColorSpan { private float mAlpha; public AlphaForegroundColorSpan(int color) {
super(color);
} public AlphaForegroundColorSpan(Parcel src) {
super(src);
} @Override
public void updateDrawState(@NonNull TextPaint ds) {
ds.setColor(getAlphaColor());
} public float getAlpha() {
return mAlpha;
} public void setAlpha(float alpha) {
mAlpha = alpha;
} private int getAlphaColor() {
int foregroundColor = getForegroundColor();
return Color.argb((int) (mAlpha * 255), Color.red(foregroundColor),
Color.green(foregroundColor), Color.blue(foregroundColor));
}
}

然后在代码中动态调用actionbar的setTitle方法就行。

    private AlphaForegroundColorSpan mAlphaForegroundColorSpan;

    private SpannableStringBuilder mSpannableStringBuilder;
mAlphaForegroundColorSpan = new AlphaForegroundColorSpan(getResources().getColor(R.color.dark));
    private void setTitleAlpha(float alpha) {
mAlphaForegroundColorSpan.setAlpha(alpha);
mSpannableStringBuilder.setSpan(mAlphaForegroundColorSpan, 0,
mSpannableStringBuilder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
getSupportActionBar().setTitle(mSpannableStringBuilder);
}

2.3 改变最右边的menu图标

    MenuItem moreItem;

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
moreItem = menu.add(Menu.NONE, Menu.FIRST, Menu.FIRST, null);
moreItem.setIcon(R.drawable.action_bar_icon_more);
moreItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); return super.onCreateOptionsMenu(menu);
}

动态改变

 if (moreItem != null) {
moreItem.setIcon(R.drawable.action_bar_icon_more_light);
}

2.4 改变最右边的OverFlow

如果是多个menuItem聚合在了一起,那么就会显示三个小点。怎么动态改变这三个小点的图标呢?

在style中定义好overFlow的样式:

<style name="MyOverFlow.Dark" parent="@style/Widget.AppCompat.Light.ActionButton.Overflow">
<item name="android:src">@drawable/action_bar_icon_more_dark</item>
<item name="android:contentDescription">@string/accessibility_overflow</item>
</style>

这里面的关键点在于写了一个contentDescription,作为overFlow的标识。然后在代码中写上如下的代码:

private TintImageView overflow;
      // The content description used to locate the overflow button
final String overflowDesc = getString(R.string.accessibility_overflow);
// The top-level window
final ViewGroup decor = (ViewGroup) getWindow().getDecorView();
// Wait a moment to ensure the overflow button can be located
decor.post(new Runnable() {
@Override
public void run() {
// The List that contains the matching views
final ArrayList<View> outViews = new ArrayList<>();
// Traverse the view-hierarchy and locate the overflow button
decor.findViewsWithText(outViews, overflowDesc, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
// Guard against any errors
if (outViews.isEmpty()) {
return;
}
// Do something with the view
overflow = (TintImageView) outViews.get(0);
}
});

之后就可以在代码中动态的改变了:

        if (overflow != null) {
overflow.setImageResource(R.drawable.action_bar_icon_more_light);
}

参考自:http://stackoverflow.com/questions/22046903/changing-the-android-overflow-menu-icon-programmatically

动态改变actionbar上menu的图标的更多相关文章

  1. Android 如何动态改变Actionbar上的item图标

    1.Activity菜单机制 (与dialog类似) Activity有一套机制来实现对菜单的管理,方法如下: 1.public boolean onCreateOptionsMenu(Menu me ...

  2. ToolBar、ActionBar与Menu的纠葛(以及navigationIcon、setHomeButtonEnabled、setDisplayHomeAsUpEnabled)

    因为贴图的繁琐...所以下面是无图版...完整的在这里: 探究一下toobar和actionbar在使用menu时的吊诡情况 一.背景介绍 toolbar最近比较火,而且是出出来代替actionbar ...

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

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

  4. 插件~使用ECharts动态在地图上标识点

    ECharts可以很方便的在网页上绘制地图,图表,并且可以提供下载图像,放大,缩小,拖动等功能,今天主要说一下它的地图类型(type:'map')是如何实现的. 首先在ECharts地图的坐标需要我们 ...

  5. WPF中利用后台代码实现窗口分栏动态改变

    在WPF中实现窗口分栏并能够通过鼠标改变大小已经非常容易,例如将一个GRID分成竖排三栏显示,就可以将GRID先分成5列,其中两个固定列放GridSplitter. <Grid Backgrou ...

  6. 【转】Android动态改变对 onCreateDialog话框值 -- 不错不错!!!

    原文网址:http://www.111cn.net/sj/android/46484.htm 使用方法是这样的,Activity.showDialog()激发Activity.onCreateDial ...

  7. Innosetup打包自动下载.net framework 动态库及替换卸载程序图标.

    在使用了一段时间微软自带的安装包打包工具后,总感觉不太顺利,于是便想着找一种更简单稳定的打包工具,这类工具其实还不少,最终经过各种考量,我们选择了 InnoSetup , 该工具是一个完全免费的Win ...

  8. Windows Phone 动态改变ListBox样式

    使用ListBox时通常会借助ItemTemplate帮助我们实现更复杂多样的样式显示,体现了Xaml的灵活.如何动态改变变ListBox的样式,实现类似电脑资源管理器中列表显示和图标显示形式的替换. ...

  9. extjs中第一次访问有效,第二次访问出现部分组件无法显示的,动态改变组件的label值的方法,ExtJs中组件最好少使用ID属性(推荐更多使用Name属性)

    在公司做的一个OA项目中,曾经就遇到了这样的一个问题:(我是在jsp中的div中将js render到div中去的)第一次访问此界面的时候,formpanel上的组件能正常显示,不刷新整个页面的前提下 ...

随机推荐

  1. caffe-window搭建自己的小项目例子

    手头有一个实际的视觉检测的项目,用的是caffe来分类,于是需要用caffe新建自己的项目的例子.在网上找了好久都没有找到合适的,于是自己开始弄. 1 首先是配置caffe的VC++目录中的inclu ...

  2. rsync密码使用要注意的几个点

    1 客户端和服务端的密码文件不一样 服务端的密码文件格式是: 用户名:密码 比如: yejianfeng:123456   客户端的密码文件格式是: 密码: 比如 123456   所以如果一个机器即 ...

  3. OpenJudge2728:摘花生 解题报告

    2728:摘花生 总时间限制:  1000ms 内存限制: 65536kB 描述 Hello Kitty 想摘点花生送给她喜欢的米老鼠.她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南 ...

  4. JavaScript动态增删改表格数据

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  5. vs2010 用户控件拖到aspx页面不可用

    错误描述: 在web项目中添加一个用户控件,直接拖动用户控件ascx到aspx页面出现a标签而不是控件标签 解决办法: 把“源”切换为“设计”视图,然后拖动ascx用户控件到页面即可:

  6. iOS 阶段学习第八天笔记(指针)

    iOS学习(C语言)知识点整理 一.指针 1)概念:存储变量的地址的一个变量. 2) 数据存储类型分析 1.text (代码段) :存储二进制的可执行代码 2.data(初始化的数据段) 存储初始化的 ...

  7. android app自动化测试之UIAutomator

    一.UIAutomator Android自动化测试工具有很多,但是要免费.易上手,本人觉得就直接使用Eclipse自带的UIAutomator就不错.测试人员无需跟开发要代码信息,只要手机上有安装之 ...

  8. 使用Eclipse为Android定义style

    1.首先,在values目录下,新建一个styles.xml文件: 2.进入styles.xml文件,点击Resources: 3.点击Add按钮,在弹出的对话框中选择在顶层创建新元素,在选择Styl ...

  9. luogg_java学习_01_JAVA基本概述

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 1.1基础常识 常用的dos命令 dir 列出当前目录 ...

  10. 从零开始学Python04作业源码:模拟ATM电子银行(仅供参考)

    bin目录:程序启动入口 ATM_start.py: #!/usr/bin/python # -*- coding: utf-8 -*- # 模拟ATM电子银行+登录账户权限控制+管理员管理模块 # ...