View编程(9): TypeArray、attrs.xml

博客 http://blog.csdn.net/androidbluetooth/article/details/6725005 简单介绍了一下如何自定义 view 以及如何为自定义的 view 定义属性。


这篇博客接着聊聊关于自定义属性。


我们可以在 res/values/attrs.xml 里面自定义属性,那麽可以定义哪些属性,究竟又该如何定义?


在 google 提供的 android doc 上面,除了 apidemo 里面有(下面给出其文档位置信息),在其他地方没有找到具体的说明(如果您找到了告诉我,谢谢),不过在其他地方找到了答案。


sdk根目录:


1)/docs/resources/samples/ApiDemos/res/values/attrs.html

2)/docs/resources/samples/ApiDemos/src/com/example/android/apis/view/LabelView.html


可以定义的种类(10 种):

"reference" //引用

"color" //颜色

"boolean" //布尔值

"dimension" //尺寸值

"float" //浮点值

"integer" //整型值

"string" //字符串

"fraction" //百分数

"Enum" // 枚举

"Flag" // 标志位,可以位运算


具体使用方法(来自 http://googlers.iteye.com/blog/1122585):


1. reference:参考某一资源ID


    (1)属性定义:
            <declare-styleable name = "名称">
                   <attr name = "background" format = "reference" />
            </declare-styleable>


    (2)属性使用:
            <ImageView
                     android:layout_width = "42dip"
                     android:layout_height = "42dip"
                     android:background = "@drawable/图片ID"
                     />

2. color:颜色值


    (1)属性定义:
            <declare-styleable name = "名称">
                   <attr name = "textColor" format = "color" />
            </declare-styleable>


    (2)属性使用:
            <TextView
                     android:layout_width = "42dip"
                     android:layout_height = "42dip"
                     android:textColor = "#00FF00"
                     />

 3. boolean:布尔值


    (1)属性定义:
            <declare-styleable name = "名称">
                <attr name = "focusable" format = "boolean" />
            </declare-styleable>


    (2)属性使用:
            <Button
                   android:layout_width = "42dip"
                   android:layout_height = "42dip"
                   android:focusable = "true"
                    />
 
4. dimension:尺寸值


     (1)属性定义:
             <declare-styleable name = "名称">
                   <attr name = "layout_width" format = "dimension" />
            </declare-styleable>


    (2)属性使用:
            <Button
                   android:layout_width = "42dip"
                   android:layout_height = "42dip"
                  />

 5. float:浮点值


    (1)属性定义:
            <declare-styleable name = "AlphaAnimation">
                   <attr name = "fromAlpha" format = "float" />
                   <attr name = "toAlpha" format = "float" />
            </declare-styleable>


    (2)属性使用:
            <alpha
                   android:fromAlpha = "1.0"
                   android:toAlpha = "0.7"
                   />
 
6. integer:整型值


    (1)属性定义:


            <declare-styleable name = "AnimatedRotateDrawable">
                   <attr name = "visible" />
                   <attr name = "frameDuration" format="integer" />
                   <attr name = "framesCount" format="integer" />
                   <attr name = "pivotX" />
                   <attr name = "pivotY" />
                   <attr name = "drawable" />
            </declare-styleable>


    (2)属性使用:
            <animated-rotate
                   xmlns:android = "http://schemas.android.com/apk/res/android"  
                   android:drawable = "@drawable/图片ID"  
                   android:pivotX = "50%"  
                   android:pivotY = "50%"  
                   android:framesCount = "12"  
                   android:frameDuration = "100"
                   />
 
7. string:字符串


    (1)属性定义:
            <declare-styleable name = "MapView">
                   <attr name = "apiKey" format = "string" />
            </declare-styleable>


    (2)属性使用:
            <com.google.android.maps.MapView
                    android:layout_width = "fill_parent"
                    android:layout_height = "fill_parent"
                    android:apiKey = "0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g"
                    />


8. fraction:百分数


     (1)属性定义:
            <declare-styleable name="RotateDrawable">
                   <attr name = "visible" />
                   <attr name = "fromDegrees" format = "float" />
                   <attr name = "toDegrees" format = "float" />
                   <attr name = "pivotX" format = "fraction" />
                   <attr name = "pivotY" format = "fraction" />
                   <attr name = "drawable" />
            </declare-styleable>


    (2)属性使用:
            <rotate
                 xmlns:android = "http://schemas.android.com/apk/res/android" 
            android:interpolator = "@anim/动画ID"
                 android:fromDegrees = "0" 
            android:toDegrees = "360"
                 android:pivotX = "200%"
                 android:pivotY = "300%" 
            android:duration = "5000"
                 android:repeatMode = "restart"
                 android:repeatCount = "infinite"
                />


9. enum:枚举值
    (1)属性定义:
            <declare-styleable name="名称">
                   <attr name="orientation">
                          <enum name="horizontal" value="0" />
                          <enum name="vertical" value="1" />
                   </attr>            
            </declare-styleable>


    (2)属性使用:
            <LinearLayout
                    xmlns:android = "http://schemas.android.com/apk/res/android"
                    android:orientation = "vertical"
                    android:layout_width = "fill_parent"
                    android:layout_height = "fill_parent"
                    >
            </LinearLayout>


10. flag:位或运算


     (1)属性定义:
             <declare-styleable name="名称">
                    <attr name="windowSoftInputMode">
                            <flag name = "stateUnspecified" value = "0" />
                            <flag name = "stateUnchanged" value = "1" />
                            <flag name = "stateHidden" value = "2" />
                            <flag name = "stateAlwaysHidden" value = "3" />
                            <flag name = "stateVisible" value = "4" />
                            <flag name = "stateAlwaysVisible" value = "5" />
                            <flag name = "adjustUnspecified" value = "0x00" />
                            <flag name = "adjustResize" value = "0x10" />
                            <flag name = "adjustPan" value = "0x20" />
                            <flag name = "adjustNothing" value = "0x30" />
                     </attr>         
             </declare-styleable>


     (2)属性使用:
            <activity
                   android:name = ".StyleAndThemeActivity"
                   android:label = "@string/app_name"
                   android:windowSoftInputMode = "stateUnspecified|stateUnchanged|stateHidden">
                   <intent-filter>
                          <action android:name = "android.intent.action.MAIN" />
                          <category android:name = "android.intent.category.LAUNCHER" />
                   </intent-filter>
             </activity>


注意:属性定义时可以指定多种类型值。


    (1)属性定义:
            <declare-styleable name = "名称">
                   <attr name = "background" format = "reference|color" />
            </declare-styleable>


    (2)属性使用:
             <ImageView
                     android:layout_width = "42dip"
                     android:layout_height = "42dip"
                     android:background = "@drawable/图片ID|#00FF00"
                     />


以上是最基本的知识,要学以致用。注意问题:


1)自定义属性之后,一般要在自定义的 view 里面写一个对应的方法:


例如 text 属性,对应方法 setText。


2)还有就是自定义属性之后,我们可以在自定义 view 类的构造方法里面为其设置默认属性。


比如,用户没有设置 textsize 属性,那麽我们可以默认给它一个值,这样代码更加具有健壮性!


实例代码:


attrs.xml 片段

<declare-styleable name="LabelView">
        <attr name="text" format="string" />
        <attr name="textColor" format="color" />
        <attr name="textSize" format="dimension" />
    </declare-styleable>

LableView.java 片段

TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.LabelView);

        CharSequence s = a.getString(R.styleable.LabelView_text);
        if (s != null) {
            setText(s.toString());
        }

        // Retrieve the color(s) to be used for this view and apply them.
        // Note, if you only care about supporting a single color, that you
        // can instead call a.getColor() and pass that to setTextColor().
        setTextColor(a.getColor(R.styleable.LabelView_textColor, 0xFF000000));

        int textSize = a.getDimensionPixelOffset(R.styleable.LabelView_textSize, 0);
        if (textSize > 0) {
            setTextSize(textSize);
        }

        a.recycle();


首先,获取 TypeArray 对象,接着,可以使用其提供的方法获取属性对应的值并提供一个默认值。


R.styleable.LabelView_text

表示引用 attrs.xml 中 name 是 LabelView 的 text 属性,二者使用 "_ " 连接!


R.styleable.LabelView_textSize 亦如此!


最后,别忘记 a.recycle() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 在 api 文档里面有提示(在 TypeArray 类):


Class Overview

Container for an array of values that were retrieved with 
obtainStyledAttributes(AttributeSet, int[], int, int) 
or 
obtainAttributes(AttributeSet, int[]). 


Be sure to call recycle() when done with them. 
The indices used to retrieve values from this structure correspond 
to the positions of the attributes given to obtainStyledAttributes.


更多知识,可以参考学习 android 相关 view 的源码!


推荐一篇不错的博客:http://blog.csdn.net/Android_Tutor/article/details/5508615


回过头再去看看:


1)/docs/resources/samples/ApiDemos/src/com/example/android/apis/view/LabelView.html


2)android Launcher 源码中关于 attrs.xml 定义以及使用方法。






©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页