Android 自定义view相关

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"
    原文作者:超神的菠萝
    原文地址: https://www.jianshu.com/p/ec461fd5fc93
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞