android selector使用

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android Studio 中使用 Selector 来设置表格的样式是一种常见的做法。你可以通过以下步骤来实现: 1. 首先,在 `res/drawable` 目录下创建一个 XML 文件,例如 `table_selector.xml`,用于定义 Selector 的样式。可以使用 `<selector>` 元素来定义不同状态下的表格样式。 ```xml <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 默认状态 --> <item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/table_default_background" /> <!-- 按下状态 --> <item android:state_pressed="true" android:drawable="@drawable/table_pressed_background" /> <!-- 获得焦点状态 --> <item android:state_focused="true" android:drawable="@drawable/table_focused_background" /> </selector> ``` 上述代码中,我们定义了三个状态:默认状态(未按下且未获得焦点)、按下状态和获得焦点状态,并分别为每个状态指定了对应的背景资源。 2. 在 `res/drawable` 目录下创建对应的背景资源文件,例如 `table_default_background.xml`、`table_pressed_background.xml` 和 `table_focused_background.xml`。这些文件将定义表格在不同状态下的背景样式。 3. 在布局文件中使用 Selector 来设置表格的背景。例如,如果你使用 `TableLayout`,可以在 XML 中为其指定背景属性: ```xml <TableLayout ... android:background="@drawable/table_selector" ...> ... </TableLayout> ``` 这样,当表格处于不同的状态时,它们将显示不同的背景样式。 以上是使用 Selector 设置表格样式的基本步骤。你可以根据实际需求自定义 Selector 和背景样式,以满足你的设计要求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值