Android 用代码来实现selector

Android中Selector的编码实现
本文介绍了在Android中如何通过编码方式实现Selector效果,避免大量XML文件的繁琐管理。通过具体的示例代码展示了如何根据不同状态设置Drawable资源。

 众所周知,android可以通过XML文件来创建selector,以Drawable对象的形式安装到组件上,以提供统一的风格设置。但是在某些时候,我们需要通过代码的形式来实现相同的功能,例如组件数量非常多,对应不同的图片,这时候如果还用XML的话就需要创建大量的selector文件,非常繁琐。

    例如一个TextView使用了如下的selector

<TextView
        android:id="@+id/TextView_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="true"
        android:drawableTop="@drawable/selector_tabwidget_icon"
        android:textAlignment="center"
        />
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- Non focused states -->
    <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/contact" />
    <item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/contact_sel" />
    <!-- Focused states -->
    <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/contact_sel" />
    <item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/contact_sel" />
    <!-- Pressed -->
    <item android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/contact_sel" />
    <item android:state_pressed="true" android:drawable="@drawable/contact_sel" />
</selector>

 里面所引用的图片资源文件非常多,如果每个文件都对应一个XML的文件的话,就会非常繁琐,修改起来非常麻烦。

  实际上,所有XML设定能做的事情,android里同样可以用编码的方式来实现,像上面那个XML文件,就可以就下面的代码来实现:

StateListDrawable drawable = new StateListDrawable();
        //Non focused states
        drawable.addState(new int[]{-android.R.attr.state_focused, -android.R.attr.state_selected, -android.R.attr.state_pressed},
                getResources().getDrawable(R.drawable.contact));
        drawable.addState(new int[]{-android.R.attr.state_focused, android.R.attr.state_selected, -android.R.attr.state_pressed},
                getResources().getDrawable(R.drawable.contact_sel));
        //Focused states
        drawable.addState(new int[]{android.R.attr.state_focused,-android.R.attr.state_selected, -android.R.attr.state_pressed},
                getResources().getDrawable(R.drawable.contact_sel));
        drawable.addState(new int[]{android.R.attr.state_focused,android.R.attr.state_selected, -android.R.attr.state_pressed},
                getResources().getDrawable(R.drawable.contact_sel));
        //Pressed
        drawable.addState(new int[]{android.R.attr.state_selected, android.R.attr.state_pressed},
                getResources().getDrawable(R.drawable.contact_sel));
        drawable.addState(new int[]{android.R.attr.state_pressed},
                getResources().getDrawable(R.drawable.contact_sel));
          
        TextView textView = (TextView) findViewById(R.id.TextView_title);
                 
        textView.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);

注意里面的“-”号,当XML的设定是false时,就需要使用资源符号的负值来设定。

转载于:https://www.cnblogs.com/zhujiabin/p/4447685.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值