Android 自定义view的四个构造函数什么情况下调用
// 在new一个view的时会被调用
public TestView7(Context context) {
super(context);
}
// 在xml中定义时会被调用(即使xml中的自定义view有使用自定义属性,依然调用2个参数的构造方法)
public TestView7(Context context, AttributeSet attrs) {
super(context, attrs);
}
// 自己手动调用才会被使用
public TestView7(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
// 自己手动调用才会被使用
public TestView7(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
Android 自定义view构造方法中的参数都是什么
Context:上线文
AttributeSet attrs : 从xml中定义的参数
int defStyleAttr :自定义view的主题(主题中优先级最高的属性)
int defStyleRes :自定义view的风格(style中次于xml中定义的风格)
在android中的属性可以在多个地方进行赋值,涉及到的优先级排序为:
Xml直接定义 > xml中style引用 > defStyleAttr > defStyleRes > theme直接定义
如何自定义view的属性
Custom View添加自定义属性主要是通过declare-styleable标签为其配置自定义属性,具体做法是: 在res/values
目录下增加一个resources xml文件,示例如下(res/values/attrs_my_custom_view.xml):
<resources>
<declare-styleable name="MyCustomView">
<attr name="custom_attr1" format="string" />
<attr name="custom_attr2" format="string" />
<attr name="custom_attr3" format="string" />
<attr name="custom_attr4" format="string" />
</declare-styleable>
<attr name="custom_attr5" format="string" />
</resources
获取自定义属性
public MyCustomView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView);
String attr1 = ta.getString(R.styleable.MyCustomView_custom_attr1);
String attr2 = ta.getString(R.styleable.MyCustomView_custom_attr2);
String attr3 = ta.getString(R.styleable.MyCustomView_custom_attr3);
String attr4 = ta.getString(R.styleable.MyCustomView_custom_attr4);
Log.e("customview", "attr1=" + attr1);
Log.e("customview", "attr2=" + attr2);
Log.e("customview", "attr3=" + attr3);
Log.e("customview", "attr4=" + attr4);
ta.recycle();
}
使用自定义view的属性值
在xml的根layout中引入命名空间
xmlns:lsp="http://schemas.android.com/apk/res-auto"(lsp是自己起的名字)
在自己的view中使用
android:padding="10dp"
lsp:image="@mipmap/ic_launcher"