Android里面经常会使用shape或者selector来定制一些View的背景。那么如果想要动态更改shape或者seletor文件中的颜色值,该怎么处理呢?

一、Java代码更改shape的颜色值

shape文件如下:

<?xml version="1.0" encoding="utf-8"?>
<!-- popwindow样式文本框区域背景 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"> <!-- 圆角 -->
<corners
android:radius="5dp"/> <!-- 描边 -->
<stroke
android:width="1dp"
android:color="#709e9e9e"/> <!-- 内边距 -->
<!-- <padding
android:left="5dp"
android:right="5dp"
android:top="5dp"
android:bottom="10dp"/> --> <!-- 填充 -->
<solid android:color="#ffffffff" /> </shape>

Java代码如下:

GradientDrawable myGrad = (GradientDrawable)view.getBackground();
myGrad.setColor(ContextCompat.getColor(mContext,R.color.spinnerpop_notedit_bg_color)); myGrad.setStroke(2,ContextCompat.getColor(mContext,R.color.spinnerpop_notedit_bg_color));

二、Java代码更改selector的颜色值

selector文件如下:

<?xml version="1.0" encoding="utf-8"?>
<!-- popwindow样式下拉菜单列表项背景 -->
<selector xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 触发时、按压时:上浅颜色->下深颜色 -->
<!-- android:angle="270"自上而下
android:angle="90"自下而上 -->
<item android:state_focused="true">
<shape>
<!-- 填充-->
<solid android:color="#709e9e9e"/>
<!-- 描边 -->
<!-- <stroke
android:width="1dp"
android:color="#709e9e9e"/> -->
<!-- 圆角 -->
<corners
android:radius="5dp" />
</shape>
</item> <item android:state_pressed="true">
<shape>
<!-- 填充-->
<solid android:color="#709e9e9e"/>
<!-- 描边 -->
<!-- <stroke
android:width="1dp"
android:color="#709e9e9e"/> -->
<!-- 圆角 -->
<corners
android:radius="5dp" />
</shape>
</item> <!-- 正常时:透明色 -->
<item>
<shape>
<!-- 填充-->
<solid android:color="@android:color/transparent"/>
<!-- 圆角 -->
<!--<corners
android:radius="5dp" />-->
</shape>
</item> </selector>

java代码如下:

因为StatelistDrawable内获取状态以及drawable的方法都是被隐藏的,所以只有利用Java的反射机制来获取各个状态,以及各个状态对应的drawable。

       StateListDrawable mySelectorGrad = (StateListDrawable)view.getBackground();

            try {
Class slDraClass = StateListDrawable.class;
Method getStateCountMethod = slDraClass.getDeclaredMethod("getStateCount", new Class[0]);
Method getStateSetMethod = slDraClass.getDeclaredMethod("getStateSet", int.class);
Method getDrawableMethod = slDraClass.getDeclaredMethod("getStateDrawable", int.class);
int count = (Integer) getStateCountMethod.invoke(mySelectorGrad, new Object[]{});//对应item标签
Log.d(TAG, "state count ="+count);
for(int i=0;i < count;i++) {
int[] stateSet = (int[]) getStateSetMethod.invoke(mySelectorGrad, i);//对应item标签中的 android:state_xxxx
if (stateSet == null || stateSet.length == 0) {
Log.d(TAG, "state is null");
GradientDrawable drawable = (GradientDrawable) getDrawableMethod.invoke(mySelectorGrad, i);//这就是你要获得的Enabled为false时候的drawable
drawable.setColor(Color.parseColor(checkColor));
} else {
for (int j = 0; j < stateSet.length; j++) {
Log.d(TAG, "state =" + stateSet[j]);
Drawable drawable = (Drawable) getDrawableMethod.invoke(mySelectorGrad, i);//这就是你要获得的Enabled为false时候的drawable }
}
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}

android:state_focused  对应的Java中的整型值 : android.R.attr.state_focused,如果为false,则对应 - android.R.attr.state_focused【“-”负号表示对应的属性值为false

android:state_pressed   对应的Java中的整型值 : android.R.attr.state_pressed,如果为false,则对应 - android.R.attr.state_pressed【“-”负号表示对应的属性值为false

参考资料

在使用shape的同时,用代码修改shape的颜色属性

获取xml里设置的statelistdrawable内的各个状态对应的drawable

android背景选择器selector用法汇总

关于自定义drawable圆角,代码中动态修改边线及填充色

Java代码更改shape和selector文件的颜色值的更多相关文章

  1. 手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件

    1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有不爽.此篇博客教你如何方便快捷地把java代码,打包成jar文件以 ...

  2. 使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置

    1.使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置 2.上代码:在resources目录下新建:generatorConfiguration.xml文 ...

  3. 代码设置Shape和Selector

    开发中经常需要使用Shape和Selector,如果每个都用xml设置的话,会占用apk大小,同时命名多了也会混乱,使用代码来设置会方便很多. 需要用到2个类:GradientDrawable和Sta ...

  4. Spring MVC框架下在java代码中访问applicationContext.xml文件中配置的文件(可以用于读取配置文件内容)

    <bean id="propertyConfigurer" class="com.****.framework.core.SpringPropertiesUtil& ...

  5. java代码实现ftp服务器的文件上传和下载

    java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools   工具类: ...

  6. 用java代码解决excel打开csv文件乱码问题

      Java 读取csv文件后,再保存到磁盘上,然后直接用Excel打开,你会发现里面都是乱码. 贴上代码: public class Test { public static void main(S ...

  7. java代码用dom4j解析xml文件的简单操作

    时间: 2016/02/17 目标:为telenor的ALU Femto接口写一个采集xml文件并解析出locationName标签里的值,然后更新到数据库中. 从网上搜了下,有四种常用的解析xml的 ...

  8. 在java代码中用xslt处理xml文件

    java处理xml文件 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExceptio ...

  9. Java代码中解压RAR文件

    import java.io.File; import java.io.FileOutputStream; import de.innosystec.unrar.Archive; import de. ...

随机推荐

  1. 地磁应用中的低功耗无线数传模块xbee PRO S2C

    地球上每一个地理坐标点,在一段时间内磁场强度是恒定的,当车辆这种铁磁物质经过这个点时,对这个点的磁场强度产生一个连续的扰动,通过磁传感器采样数据与初始采样数据(该点的地球磁场值)进行对比,其差值为车辆 ...

  2. 字典 Dictionary

    字典 Dictionary {Key-Value} 1.字典是无序的,没有下标(因为有key,取值直接用key值) Key尽量不要用中文编写,以防止编码不同导致取不出来 2.字典常用方法: 查找: ① ...

  3. 运用PIL库 用来美白,磨皮,瘦脸等操作!

    1.安装pillow库: 在cmd下,输入简单的命令: pip install pillow  即可安装pillow库. 2.PIL库的简介: 1. PIL库主要有2个方面的功能: (1) 图像归档: ...

  4. 学习笔记整理之StringBuffer与StringBulider的线程安全与线程不安全

    关于线程和线程不安全: 概述 编辑 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就 ...

  5. Linux---设备文件名和挂载点

    分区: 1.分区: MBR   GPT 2.格式化  : 为了写入文件系统 3.设备文件名 4.什么是挂载点? 挂载点:使用已经存在的空目录作为挂载点 挂载: 必须分区: / (根分区) swap分区 ...

  6. vue学习_01

    一.什么是VUE 渐进式的前端框架,MVVM(Model,view,viewmodel)模式,饿了么用的就是vue框架 二.VUE基本语法 1.引入vue: <script src=" ...

  7. JavaScript基础视频教程总结(111-120章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. 用pyspider爬取并解析json字符串

    获取堆糖网站所有用户的id 昵称及主页地址 #!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2016-06-21 13:57: ...

  9. 【repost】图解Javascript上下文与作用域

    本文尝试阐述Javascript中的上下文与作用域背后的机制,主要涉及到执行上下文(execution context).作用域链(scope chain).闭包(closure).this等概念. ...

  10. Django积木块11 —— 缓存

    缓存 Django的缓存可以缓存视图中的函数,模版中的内容,和一些不长变化的数据. # setting CACHES = { 'default':{ 'BACKEND':'django.core.ca ...