zoukankan      html  css  js  c++  java
  • Android 用代码来实现selector

     众所周知,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时,就需要使用资源符号的负值来设定。

  • 相关阅读:
    OSPF
    【今日CS 视觉论文速览】 24 Jan 2019
    【今日CS 视觉论文速览】Wed, 23 Jan 2019
    【今日CS 视觉论文速览】 21 Jan 2019
    【Processing学习笔记】安装与入门
    【今日CS 视觉论文速览】Part2, 18 Jan 2019
    【今日CS 视觉论文速览】Fri, 18 Jan 2019
    【今日CS 视觉论文速览】Thu, 17 Jan 2019
    【今日CS 视觉论文速览】Part2, 16 Jan 2019
    【今日CS 视觉论文速览】Wed, 16 Jan 2019
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4447685.html
Copyright © 2011-2022 走看看