【转】java代码中实现android背景选择的selector-StateListDrawable的应用
原文网址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0924/1712.html
下面的代码应该很多人都熟悉:
1
2
3
4
5
6
|
<?xml version= "1.0" encoding= "utf-8" ?> <item android:drawable= "@drawable/numpad_button_bg_selected" android:state_selected= "true" ></item> <item android:drawable= "@drawable/numpad_button_bg_pressed" android:state_pressed= "true" ></item> <item android:drawable= "@drawable/numpad_button_bg_normal" ></item> </selector> |
这是一个给button使用的背景选择,这种不同状态显示不同背景的xml文件我们称为selector。其实selector的本质是一个drawable对象。
如果要用java代码实现上述的selector该如何实现呢?答案是StateListDrawable。
我们先看一个实现StateListDrawable的最简单例子:
1
2
3
4
|
StateListDrawable drawable = new StateListDrawable(); drawable.addState( new int[]{android.R.attr.state_focused}, mFocusedDrawable); drawable.addState( new int[]{android.R.attr.state_enabled, android.R.attr.state_pressed}, mEnabledPressedDrawable); drawable.addState( new int[0], mDefaultDrawable); |
这段代码中我们添加了三种状态。
下面我们用更规范的代码来演示如何在java中使用StateListDrawable,以及她对应的xml写法:
首先定义一个获得StateListDrawable对象的方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
private StateListDrawable addStateDrawable(Context context, int idNormal, int idPressed, int idFocused) { StateListDrawable sd = new StateListDrawable(); Drawable normal = idNormal == -1 ? null : context.getResources().getDrawable(idNormal); Drawable pressed = idPressed == -1 ? null : context.getResources().getDrawable(idPressed); Drawable focus = idFocused == -1 ? null : context.getResources().getDrawable(idFocused); //注意该处的顺序,只要有一个状态与之相配,背景就会被换掉 //所以不要把大范围放在前面了,如果sd.addState(new[]{},normal)放在第一个的话,就没有什么效果了 sd.addState( new int[]{android.R.attr.state_enabled, android.R.attr.state_focused}, focus); sd.addState( new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}, pressed); sd.addState( new int[]{android.R.attr.state_focused}, focus); sd.addState( new int[]{android.R.attr.state_pressed}, pressed); sd.addState( new int[]{android.R.attr.state_enabled}, normal); sd.addState( new int[]{}, normal); return sd; } |
其中,就如注释中所讲的addState
的顺序相当重要。
使用ddStateDrawable
1
2
3
|
//……前面对Button的声明略去 okBtn.setBackgroundDrawable(addStateDrawable( this , R.drawable.btn_normal, R.drawable.btn_selected, R.drawable.btn_selected)); cancelBtn.setBackgroundDrawable(addStateDrawable( this , R.drawable.btn_normal, R.drawable.btn_selected, R.drawable.btn_selected)); |
xml方式实现:
下面对应的具体实例,由于是做背景用,该xml将放于/res/drawable下面(StateList中第一个匹配当前状态的item会被使用。因此,如果第一个item没有任何状态特性的话,那么它将每次都被使用,这也是为什么默认的值必须总是在最后)
selector的定义:
1
2
3
4
5
6
7
|
<?xml version= "1.0" encoding= "utf-8" ?> <item android:state_pressed= "true" android:drawable= "@drawable/btn_selected" /> <item android:state_focused= "true" android:drawable= "@drawable/btn_selected" /> <item android:state_enabled= "true" android:drawable= "@drawable/btn_normal" /> <item android:drawable= "@drawable/btn_normal" /> </selector> |
使用selector
1
2
3
4
5
6
7
8
9
10
11
|
<Button android:id= "@+id/canel" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:text= "@string/btn_cancel" android:layout_margin= "10dip" android:layout_weight= "1" android:textColor= "#ffffffff" android:textSize= "15sp" android:background= "@drawable/button_drawable" /> |
【转】java代码中实现android背景选择的selector-StateListDrawable的应用的更多相关文章
- java代码中实现android背景选择的selector-StateListDrawable的应用
首先定义一个获得StateListDrawable对象的方法: private StateListDrawable addStateDrawable(Context context, int idNo ...
- android中在java代码中设置Button按钮的背景颜色
android中在java代码中设置Button按钮的背景颜色 1.设置背景图片,图片来源于drawable: flightInfoPanel.setBackgroundDrawable(getRes ...
- Android color(颜色) 在XML文件和java代码中
Android color(颜色) 在XML文件和java代码中,有需要的朋友可以参考下. 1.使用Color类的常量,如: int color = Color.BLUE;//创建一个蓝色 是使用An ...
- IDEA插件:快速删除Java代码中的注释
背景 有时,我们需要删除Java源代码中的注释.目前有不少方法,比如: 实现状态机.该方式较为通用,适用于多种语言(取决于状态机支持的注释符号). 正则匹配.该方式容易误判,尤其是容易误删字符串. ...
- UML中类关系表示与Java代码中的对应关系
UML中类关系表示与Java代码中的对应关系 1. 类的UML表示法 上图中,Employee 类有两个String类型的私有属性和一个返回值为String类型public 方法 getName(); ...
- paip.java 开发中web server的选择jboss resin tomcat比较..
paip.java 开发中web server的选择jboss resin tomcat比较.. 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专 ...
- Spring MVC框架下在java代码中访问applicationContext.xml文件中配置的文件(可以用于读取配置文件内容)
<bean id="propertyConfigurer" class="com.****.framework.core.SpringPropertiesUtil& ...
- 使用mongo-java-driver3.0.2.jar和mongodb3.0在java代码中的用户验证4
以下是使用mongo-java-driver3.0.2.jar和mongodb3.0.4在java代码中的用户验证: ServerAddress sa = new ServerAddress(host ...
- 关于在Java代码中写Sql语句需要注意的问题
最近做程序,时不时需要自己去手动将sql语句直接写入到Java代码中,写入sql语句时,需要注意几个小问题. 先看我之前写的几句简单的sql语句,自以为没有问题,但是编译直接报错. String st ...
随机推荐
- 使用DataContractJsonSerializer类将类型实例序列化为JSON字符串和反序列化为实例对象 分类: JSON 前端 2014-11-10 10:20 97人阅读 评论(1) 收藏
一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大 ...
- .Net开源SqlServer ORM框架SqlSugar整理
一.链接整理 官方Git源代码地址: https://github.com/sunkaixuan/SqlSugar 最新发布版更新地址:当前版本Release 3.5.2.1 https://gith ...
- java中时间差计算
public class Utill { public String TimeString(Date currentTime, Date beginTime){ /*默认为毫秒,除以1000是为了转换 ...
- SQLServer2008找出所有包含172.17.224.40字样的存储过程
SQLServer2008 找出所有包含172.17.224.40的存储过程 select distinct name from syscomments a,sysobjects b where ...
- Objective c 自动释放池
学IOS 的大家都知道,IOS 一共有三种内存管理方式:MRC .ARC.自动释放池.我按照我个人的理解简述一下自动释放池,希望能给大家一点帮助,如有错误请大家及时批评指正. 自动释放池有几个特点:1 ...
- ie6常见的兼容性
1.IE6怪异解析之padding与border算入宽高 原因:未加文档声明造成非盒模型解析 解决方法:加入文档声明<!doctype html> 2.IE6在块元素.左右浮动.设定mar ...
- YII CRUD 例子
< ? php class PostTest extends CDbTestCase{ public $ fixtures = array ( 'posts' = > 'Post' , ' ...
- jquery插件-validate
1.引入js,css 下载地址:http://plugins.jquery.com/validate/ 2.设置验证规则:input的class添加以下验证属性 3.设置不符合规则的提示信息:添加da ...
- thinkphp3.2 namespace及use用法
PHP 5.3中的namespace其实是个不错的东西,可以简化编程,下面介绍三类在代码中 访问namespace中类的方法 1 引用namespace和类 假设namespace的程序为name ...
- 鸟哥的linux私房菜——第12章 正则表达式与文件格式化处理
12.1什么是正则表达式 正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找.删除.替换某特定字符串的处理程序. vi.gr ...