自定义控件(继承系统控件,非自绘)

  1. 写一个类继承已有的控件(比如textview),override其中的构造函数:
    一般重写这两个构造函数:
public class MyTextView extends TextView {
    public MyTextView(Context context) {
        super(context);
    }

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

一个构造函数一般在代码里new这个自定义控件时使用

第二个构造函数是在layout的xml文件中声明这个控件时,自动调用,attrs里包含了在xml中给这个自定义view设置的所有属性,包括自定义属性和系统属性

  1. 在xml中声明这个自定义控件,并设置相关属性



    

  1. 这时候,可以在其构造函数中获取这些定义的系统属性:
public MyTextView(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray typedArray = context.obtainStyledAttributes(attrs,
            new int[]{android.R.attr.text});
    String strValue = typedArray.getString(0);
}

obtainStyledAttributes用于在所有属性集合(attrs)中获取我们需要的属性值,第二个参数是一个int数组,里面设置我们需要获取的属性对应的资源id,比如textview的text属性其实是在android的系统资源的属性文件中设置的一个属性

  1. 使用自定义属性:
    首先在res/values底下建立一个attrs.xml文件,指定自定义属性集合的名字,以及里面的属性名和属性格式:


    
        
        
        
        
    

在xml中定义自定义属性的命名空间并设置自定义属性:




    

自定属性的命名空间名字可以随意,值统一为:http://schemas.android.com/apk/res-auto

在代码中获取自定义属性值:

public MyTextView(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray typedArray = context.obtainStyledAttributes(attrs,
            R.styleable.MyTextViewStyle);

    String strValue_one = typedArray.getString(R.styleable.MyTextViewStyle_attr_one);
}

在样式(style.xml)中给自定义属性赋值,不需要android:xxx,直接写属性名即可


你可能感兴趣的:(自定义控件(继承系统控件,非自绘))