TypedArray和obtainStyledAttributes使用

下面我以一个自定义控件来说明一下它的使用
1.首先要创建变量,创建了个values/attrs.xml文件,文件名任意,但是要在values目录下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--StrechView-->
    <declare-styleable name="StretchPanel">
        <attr name="contentView" format="reference" />
        <attr name="stretchView" format="reference" />
    </declare-styleable>
    <!--MyButton-->
    <declare-styleable name="MyButton">
        <attr name="textSize" format="dimension"></attr>
        <attr name="textColor" format="color"></attr>
        <attr name="text" format="string"></attr>
    </declare-styleable>
</resources>

根标签要是resources,定义的变量要有个名字,declare-styleable name="MyButton">,这里定义名称为button。在这个名称里,可以有多个自定义属性。定义了个名为textSize的属性,格式是dimension,这个format指定了textSize属性的类型,只能用于定义字体大小
2.然后是自定义Button:
package com.example.a31210.mybottombarlayout.activity.index;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.Button;

import com.example.a31210.mybottombarlayout.R;

/**
 * Created by YuShuangPing on 2018/4/13.
 */

public class MyButton extends Button {
    public MyButton(Context context) {
        super(context);
        init(context,null);

    }

    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context,attrs);
    }

    public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context,attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        TypedArray typedArray=context.obtainStyledAttributes(attrs, R.styleable.MyButton);
        this.setText(typedArray.getString(R.styleable.MyButton_text));
        this.setTextSize(typedArray.getDimension(R.styleable.MyButton_textSize,15));
        this.setTextColor(typedArray.getColor(R.styleable.MyButton_textColor,getResources().getColor(R.color.colorAccent)));
        typedArray.recycle();
    }

}

其中,TypedArray实例是个属性的容器,context.obtainStyledAttributes()方法返回得到。AttributeSet是节点的属性集合

3.在布局文件中通过自定义属性赋值:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:stretch="http://schemas.android.com/apk/res-auto"
    xmlns:button="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#f4f4f4"
    tools:context="com.example.a31210.mybottombarlayout.activity.index.MainActivity">
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <com.example.a31210.mybottombarlayout.activity.index.StretchView
                android:id="@+id/stretch_1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="1dp"
                stretch:contentView="@layout/view_content_contractdetail_sellerinformation"
                stretch:stretchView="@layout/view_stretch_contractdetail_sellerinformation">

            </com.example.a31210.mybottombarlayout.activity.index.StretchView>

            <com.example.a31210.mybottombarlayout.activity.index.StretchView
                android:id="@+id/stretch_2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="1dp"
                stretch:contentView="@layout/view_content_contractdetail_buyinformation"
                stretch:stretchView="@layout/view_stretch_contractdetail_buyinformation">
            </com.example.a31210.mybottombarlayout.activity.index.StretchView>

            <com.example.a31210.mybottombarlayout.activity.index.StretchView
                android:id="@+id/stretch_3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="1dp"
                stretch:contentView="@layout/view_content_contractdetail_recinformation"
                stretch:stretchView="@layout/view_stretch_contractdetail_redinformation">
            </com.example.a31210.mybottombarlayout.activity.index.StretchView>

            <com.example.a31210.mybottombarlayout.activity.index.StretchView
                android:id="@+id/stretch_4"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="1dp"
                stretch:contentView="@layout/view_content_contractdetail_recinformation"
                stretch:stretchView="@layout/view_stretch_contractdetail_redinformation2">
            </com.example.a31210.mybottombarlayout.activity.index.StretchView>

            <com.example.a31210.mybottombarlayout.activity.index.MyButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                button:text="按钮"
                button:textSize="18sp"/>
        </LinearLayout>

    </ScrollView>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:text="版权归我所有"
        android:gravity="center"/>



</LinearLayout>

这里在根标签中增加了:
xmlns:button="http://schemas.android.com/apk/res-auto"

声明了button这个名字空间,myapp是任意的名称,自己可以随便起名,后面的:
"http://schemas.android.com/apk/res-auto"

是固定的
 typedArray.getDimension(R.styleable.MyButton_textSize,15);

将获取自定义textSize的值,如果没有,则使用默认的值,15

最后别忘记调用:
 typedArray.recycle();

 
 



猜你喜欢

转载自blog.csdn.net/yushuangping/article/details/79925876