一、作用
二、概念
总共有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 中使用,调用的是二个参数的构造函数
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<com.example.myapplication.diyview.sense.RoundImageView
android:layout_width="300dp"
android:layout_height="300dp" />
</RelativeLayout>
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: 三个参数的构造方法