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

  • 相关阅读:
    Python中CreateCompatibleDC和CreateBitmap造成的内存泄漏
    POJ 2420 模拟退火
    LR(1)分析表-语法树-四元式
    C语言文法
    计蒜客 18018 热爱工作的蒜蒜 最短路+dp
    HDU 5988 最小费用流
    POJ 1808 平方剩余
    POJ 2115 单变元模线性方程
    计蒜客 17414 Exponial 指数降幂公式
    计蒜客 17412 Card Hand Sorting 最长公共子序列
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4447685.html
Copyright © 2011-2022 走看看