TypedArray和obtainStyledAttributes使用

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



    
    
        
        
    
    
    
        
        
        
    

根标签要是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.在布局文件中通过自定义属性赋值:



    
        
            

            

            
            

            
            

            
            

            
        

    
    




这里在根标签中增加了:
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();

 
  



你可能感兴趣的:(android进阶)