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. 微信小程序开发之搞懂flex布局1——Flexbox

    Flexbox ——弹性布局 Flexbox is a layout model for displaying items in a single dimension — as a row or as ...

  2. golang使用 gzip压缩

    golang使用 gzip压缩 这个例子中使用gzip压缩格式,标准库还支持zlib, bz2, flate, lzw 压缩处理_三步: 1.创建压缩文件2.gzip write包装3.写入数据 ou ...

  3. HDU 4609 3-idiots (组合数学 + FFT)

    题意:给定 n 条边,问随机选出 3 条边,能组成三角形的概率是多少. 析:答案很明显就是  能组成三角形的种数 / (C(n, 3)).现在的问题是怎么求能组成三角形的种数. 这个博客说的非常清楚了 ...

  4. tab选项卡--jq

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. c++中二级指针的使用场景

    二级指针的使用场景如下: 1.主要用来为指针变量分配内存空间: void GetMemory(char **p) { *p = ]; } 函数调用方式: char *str = NULL; GetMe ...

  6. 计算机网络三:域名、IP地址和TCP/IP协议

    一.域名        域名(Domain Name),简称域名.网域,是由一串用点分隔的字符型标志名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时 ...

  7. hadoop配置笔记

    接上回,hadoop的配置文件都在下载的压缩包目录中的etc/hadoop/中 hadoop-env.sh有个地方配置java_home 其他常用的设置文件有: core-site.xml yarn- ...

  8. sqlserver 多行转一行

    sql 例子: SELECT STUFF((SELECT ',' + CONVERT(VARCHAR, b.SCsinfoSourceId) FROM PZDataCsinfo b WHERE b.D ...

  9. [转]Comparing sFlow and NetFlow in a vSwitch

    As virtualization shifts the network edge from top of rack switches to software virtual switches run ...

  10. jvm的垃圾回收和内存

    垃圾回收: 对象的创建是我们程序员主导的,但是却没有与之相对应的delete方法来删除我们用完的对象,释放这些我们已经不需要再使用的对象的内存空间,gc:垃圾回收机制:指的就是JVM自带的一种释放无用 ...