自定义View——View的构造函数

一、作用

二、概念

总共有4个构造函数,最后一个是API 21添加的。因此,除非你的 minSdkVersion 为21,否则不要使用它(如果想要使用 defStyleRes,只需自己调用obtainStyledAttributes()即可)

public TestView(Context context) {
    super(context);
}

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

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

public TestView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
}
  • Context
  • AttributeSet
    表示从 Layout 文件中直接为这个 View 添加的属性集合(为 View 添加属性,方式1:类似android:layout_wdith="wrap_content"直接指定;方式2:style="@style/somestyle"
  • int defStyleAttr
    应用到 View 的默认风格(定义在主题中)
  • int defStyleRes
    若没有使用 defStyleAttr,应用到 View 的默认风格

三、使用

View 总共有4个构造函数,最后一个是 API21 添加的。因此,除非你的 minSkVersion 为21,否则不要使用它(如果想使用 defStyleRes 只需自己调用 obtainStyledAttributes() 即可)。
使用建议:
(1)一般来说,只需实现前2个构造函数即可

SomeView(Context context){
  this(context,null);
}
SomeView(Context context,AttributeSet attrs){
  // 调用super()才能不报错
  super(context,attrs);
  // 然后处理其他属性
}

(2)上述三个构造函数何时调用呢?通过例子验证

  • 在代码中创建 View 时,实例化时传的几个参数就是调用几个参数的构造函数
  • 当从 XML inflate view 时,重写 View(Context,AttributeSet)
  • 剩余的知识其实可以忽略,因为可能并不需要

通过例子验证构造函数的调用

使用自定义View无非就两种情况,第一种就是直接在xml布局中使用,另一种就是在 Activity 中 new 出来,下面我们分别使用上述两种方式,为了便于观察我们在三个构造方法中分别加入一行打印。

public class RoundImageView extends ImageView{

    private static final String TAG = "RoundImageView";

    public RoundImageView(Context context) {
        super(context);
        Log.d(TAG, "一个参数的构造方法");
    }

    public RoundImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        Log.d(TAG, "二个参数的构造方法");
    }

    public RoundImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        Log.d(TAG, "三个参数的构造方法");
    }
}
  • 在 xml 中使用,调用的是二个参数的构造函数



    


2020-07-26 20:14:52.760 23458-23458/? D/RoundImageView: 二个参数的构造方法
  • 在代码中创建时,根据传入的参数个数决定
new RoundImageView(this);
new RoundImageView(this, null);
new RoundImageView(this, null,0);
2020-07-26 20:37:46.068 26251-26251/com.example.myapplication D/RoundImageView: 一个参数的构造方法
2020-07-26 20:37:46.068 26251-26251/com.example.myapplication D/RoundImageView: 二个参数的构造方法
2020-07-26 20:37:46.068 26251-26251/com.example.myapplication D/RoundImageView: 三个参数的构造方法

参考文献

深入理解 Android View 的构造函数

你可能感兴趣的:(自定义View——View的构造函数)