【转】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"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <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"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <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"

           />

时间: 2024-08-01 21:40:46

【转】java代码中实现android背景选择的selector-StateListDrawable的应用的相关文章

java代码中实现android背景选择的selector-StateListDrawable的应用

首先定义一个获得StateListDrawable对象的方法: private StateListDrawable addStateDrawable(Context context, int idNormal, int idPressed, int idFocused) { StateListDrawable sd = new StateListDrawable(); Drawable normal = idNormal == -1 ? null : context.getResources()

Android如何在java代码中设置margin

习惯了直接在xml里设置margin(距离上下左右都是10dip),如: <ImageView android:layout_margin="10dip" android:src="@drawable/image" /> 只是有些情况下,需要在java代码里来写. API中,android.view.ViewGroup.MarginLayoutParams有个方法setMargins(left, top, right, bottom).可是View本身没

java代码中获取进程process id(转)

另一方面,线程ID=进程ID+内部线程对象ID并不成立,    参考: blog.csdn.net/heyetina/article/details/6633901     如何在java代码中获取进程process id, 实现方法如下所示:    参考: rednaxelafx.iteye.com/blog/716918 http://www.cnblogs.com/mumuxinfei/p/3678854.html

【安卓】在java代码中设置drawableLeft时如何给定合适尺寸?

textView.setCompoundDrawables(drawable, null, null, null);时看不到图片,是因为需要手动给定drawable对应的尺寸,即用drawable.setBounds. 如果该drawable为图片,可直接drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());. 即直接给定图片自身尺寸,此时效果和在xml中给定一样. [安卓]在java

如何在java代码中调用一个web项目jsp或者servlet

有时候需要调用一个web项目的jsp或者servlet,但是执行内部的代码,并不是打开jsp,例如需要在一段java代码中清除一个web项目中的缓存,那么可以把清除缓存的代码放在该web项目的一个servlet中,只需要执行如下代码: URL url = new URL("http://192.168.2.123:8080/sace/ClearCache"); url.openStream(); openStream() 执行一次相当于一次URL请求,其中url.openStream(

Java代码中获取Json的key值

测试json字符串: {"access_token":"hkbQl5o_l67dZ7_vJRATKBwTLk9Yj5QyMuOJThAr8Baj0xWf4wxW1p4ym4iTZ3-ptWRRoVtbCNJnyjGLfed_4bB0HiqGP8v-aXOJUUk1tFs","expires_in":7200,"refresh_token":"_or_31yEp8XhxGWvrAzdWIkXfFlKjfb3iTRpfa

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

<bean id="propertyConfigurer" class="com.****.framework.core.SpringPropertiesUtil" lazy-init="false"> <property name="locations"> <list> <value>classpath:config/sys.properties</value> &

关于在Java代码中写Sql语句需要注意的问题

最近做程序,时不时需要自己去手动将sql语句直接写入到Java代码中,写入sql语句时,需要注意几个小问题. 先看我之前写的几句简单的sql语句,自以为没有问题,但是编译直接报错. 1 String str = "insert into XXX(a,b,c) values ('"a.getA()"','"a.getB()"','"a.getC()"');"; 研究了半天发现应该是连接字符串问题,第一次修改过后将赋值字段前后加“

转--Android如何在java代码中设置margin

http://www.2cto.com/kf/201207/140111.html 红黑联盟: 习惯了直接在xml里设置margin(距离上下左右都是10dip),如: <ImageView android:layout_margin="10dip" android:src="@drawable/image" /> 只是有些情况下,需要在java代码里来写. API中,android.view.ViewGroup.MarginLayoutParams有个