android控件在不同的状态下可以使用不同的背景,方法很简单,就是写一个xml文件,然后在这个文件里面声明不同状态下使用的背景图片或者是颜色。这个XML的格式如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize=["true" | "false"]
android:dither=["true" | "false"]
android:variablePadding=["true" | "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>
接下来介绍xml文件里面有的状态:
这是必须的。按照xml文件的格式,这个是作为整个xml文件的根。包含了一个或者多个子节点元素。
属性:
xmlns:android
字符串类型,必须的,这个定义了xml命名空间,它的值必须是”http://schemas.android.com/apk/res/android“.
android:constantSize
bool值。默认是false的。当这个值是true的时候,控件的大小是图片背景的大小(依最大背景图片的大小);false的话控件的大小是原始控件的大小。
android:dither
bool值。true的情况下如果bitmap像素跟屏幕的像素不相同的话,会调整为屏幕的像素大小(例如,一个argb888的图片,根argb565的像素,图片会被调整为argb565),默认是false,即不会被调整。
android:variablePadding
bool值。如果选中的时候padding是依据选中的时候的大小,则此时的值是true的,如果保持一样则值(依据最大的padding值)应该是false,默认是false.
attributes:
android:drawable
资源文件,是必须的。
android:state_pressed
bool值。ture表明当控件被按下的时候(就像按钮被按下的时候),false表明控件没有按下的状态
android:state_focused
bool值。true是说状态是获得了焦点(比如输入框获得了焦点),false是没有获得焦点的状态
android:state_hovered
bool值。true是双击这个控件但还没有点击其他区域;false是默认的情况。经常是这个资源是跟focused的状态下的资源是一样的。
在api14被引入。
android:state_selected
bool值。true是用户选择的项目是有导航方向的(例如有一个导航方向的列表),false就是没有被选中的状态。
这个状态在焦点不满足的情况下使用(例如listview获得了焦点,里面的项目需要选择的状态)
android:state_checkable
bool值。true是这个控件是checkbox的状态,否则是false(这个选项只有在控件有复选的控件下才有用)
android:state_checked
bool值。是否是复选的状态。
android:state_enabled
bool值。是否是可以点击的状态,接收触摸和双击事件。
android:state_activated
bool值。是否是长按的状态,例如长安高亮选中的listitem,api11引入。
android:state_window_focused
bool值。是否在前台的状态,例如弹出了一个对话框或者拉下了上面的栏目此时应该是不在前台的状态。
记住:系统会从第一个项目开始便利,如果找到了对应的项目则不会再便利了,这就是你应当把默认的状态放在最后面。
下面是一个listview选中的例子(其他的状态后面在补充):
package com.example.jaime.selectortest;
import android.content.Context;
import android.support.v4.view.LayoutInflaterFactory;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import java.util.zip.Inflater;
/**
* Created by jaime on 16/9/7.
*/
public class ListAdapter extends BaseAdapter {
private String[] _str;
private View _view;
private Context _ctx;
public ListAdapter(String[] str,Context ctx){
_str = str;
_ctx = ctx;
}
@Override
public int getCount() {
Log.d("sss",Integer.toString(_str.length));
return _str.length;
}
@Override
public Object getItem(int i) {
return _str[i];
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
// if ( _view == null ){
//
// }
_view = LayoutInflater.from(_ctx).inflate(R.layout.item,null);
TextView btn = (TextView) _view.findViewById(R.id.btn_test);
btn.setText(_str[i]);
return _view;
}
}
package com.example.jaime.selectortest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.*;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity {
// @BindView(R.id.btn_test)
// Button btn_test;
@BindView(R.id.listview)
ListView listView;
private String[] str= {"one","two","tree","four","five","six","seven"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
// btn_test.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View view) {
//
// }
// });
// btn_test.setFocusable(true);
// btn_test.setFocusableInTouchMode(true);
// btn_test.requestFocus();
ListAdapter adapter = new ListAdapter(str,this);
listView.setAdapter(adapter);
}
}
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize="false">
<item android:state_pressed="true" android:drawable="@color/colorPrimaryDark"></item>
<item android:state_pressed="false" android:drawable="@color/FFDD22"></item>
<item android:state_selected="false" android:drawable="@color/colorAccent"></item>
</selector>
运行效果就是点击项目的时候会显示colorPrimaryDark 这个颜色,当离开屏幕的时候点击的那一项会显示FFDD22。。。