语法:
Color-Selector
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:color="hex_color" //颜色值,#RGB,$ARGB,#RRGGBB,#AARRGGBB
android:state_pressed=["true" | "false"]//是否触摸
android:state_focused=["true" | "false"]//是否获得焦点
android:state_selected=["true" | "false"]//是否被状态
android:state_checkable=["true" | "false"]//是否可选
android:state_checked=["true" | "false"]//是否选中
android:state_enabled=["true" | "false"]//是否可用
android:state_window_focused=["true" | "false"] />//是否窗口聚焦
</selector>
Drawable-Selector
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize=["true" | "false"]//drawable的大小是否当中状态变化,true表示是变化,false表示不变换,默认为false
android:dither=["true" | "false"]//当位图与屏幕的像素配置不一样时
(例如,一个ARGB为8888的位图与RGB为555的屏幕)会自行递色(dither)。
设置为false时不可递色。默认true
android:variablePadding=["true" | "false"] >//内边距是否变化,默认false
<item
android:drawable="@[package:]drawable/drawable_resource"//图片资源
android:state_pressed=["true" | "false"]//是否触摸
android:state_focused=["true" | "false"]//是否获取到焦点
android:state_hovered=["true" | "false"]//光标是否经过
android:state_selected=["true" | "false"]//是否选中
android:state_checkable=["true" | "false"]//是否可勾选
android:state_checked=["true" | "false"]//是否勾选
android:state_enabled=["true" | "false"]//是否可用
android:state_activated=["true" | "false"]//是否激活
android:state_window_focused=["true" | "false"] />//所在窗口是否获取焦点
</selector>
item是从上往下匹配的,如果匹配到一个item那它就将采用这个item,而不是采用最佳匹配的规则;
所以设置默认的状态,一定要写在最后,如果写在前面,则后面所有的item都不会起作用了。
示例一:
<Button
android:id="@+id/bt_about"
android:layout_width="250dp"
android:layout_height="50dp"
android:layout_margin="5dp"
android:text="测试selector"
android:background="@drawable/selector_bg_color"
android:textColor="@drawable/selector_text_color" />
selector_bg_color.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:enterFadeDuration="3000" android:exitFadeDuration="3000">
<!-- 当前窗口失去焦点时 -->
<item android:drawable="@drawable/bg_focused" android:state_window_focused="false" />
<!-- 不可用时 -->
<item android:drawable="@drawable/bg_enabled" android:state_enabled="false" />
<!-- 按压时 -->
<item android:drawable="@drawable/bg_pressed" android:state_pressed="true" />
<!-- 被选中时 -->
<item android:drawable="@drawable/bg_selected" android:state_selected="true" />
<!-- 被激活时 -->
<item android:drawable="@drawable/bg_activated" android:state_activated="true" />
<!-- 默认时 -->
<item android:drawable="@drawable/bg_normal" />
</selector>
selector_text_color.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:enterFadeDuration="3000" android:exitFadeDuration="3000">
<!-- 当前窗口失去焦点时 -->
<item android:color="@android:color/black" android:state_window_focused="false" />
<!-- 不可用时 -->
<item android:color="@color/yellow" android:state_enabled="false" />
<!-- 按压时 -->
<item android:color="@android:color/holo_blue_light" android:state_pressed="true" />
<!-- 被选中时 -->
<item android:color="@color/blue" android:state_selected="true" />
<!-- 被激活时 -->
<item android:color="@color/colorAccent" android:state_activated="true" />
<!-- 默认时 -->
<item android:color="@android:color/white" />
</selector>
添加了下面两个属性之后,则会在状态改变时出现淡入淡出效果,但必须在API Level 11及以上才支持:
android:enterFadeDuration //状态改变时,新状态展示时的淡入时间,以毫秒为单位
android:exitFadeDuration //状态改变时,旧状态消失时的淡出时间,以毫秒为单位
一般来说,Button控件只需要用 android:state_pressed就可以。
示例二:
Button控件的背景设置为:
<?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/bg_selected"></item>
<item android:drawable="@drawable/bg_unselect"></item>
</selector>
Button控件的文字设置为:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" android:color="#ffffff"></item>
<item android:color="#000000"></item>
</selector>
禁用button按钮点击
// btn_about.setActivated(false);//可点击
// btn_about.setSelected(false);//可点击
// btn_about.setFocusable(false);//可点击
// btn_about.setPressed(false);//可点击
// btn_about.setClickable(false);//可点击
btn_about.setEnabled(false);//不可点击,
要想设置button不可点击,最好设置Android:enabled。
android:clickable是没有效果的,Button默认clickable是true。
setClickable与setEnable函数的区别,前者是设置点击一次,后者才是设置是否可以点击的函数
setClickable使View能够被点击,在点击的同时能够触发pressed的状态。
如果把clickable设置为false将不能被点击;
setEnable不仅使View不能够被点击,还会改变View的外表颜色表示它的状态;
setSelected通常用在AdapterView中
注意:
btn_about.setEnabled(false);//不可点击,
btn_about.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("11111111111111","1111111111111111111111");
}
});
和
btn_about.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("11111111111111","1111111111111111111111");
}
});
btn_about.setClickable(false);//不可点击
一样的效果,打印不出来log,说明屏蔽了onClick事件。
但是如果setClickable(false)放在点击事件前面会没效果。
btn_about.setClickable(false);//可点击
btn_about.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("11111111111111","1111111111111111111111");
}
});