美文网首页安卓UIAndroid开发积累
自定义View之构造方法

自定义View之构造方法

作者: NoBugException | 来源:发表于2019-02-25 22:27 被阅读27次

在我们编写自定义view时第一件事总是编写构造方法,就以自定义Textview为例

public class CustomTextView extends AppCompatTextView {
    public CustomTextView(Context context) {
        super(context);
    }

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

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

我们写好它的构造方法,以上就是默认情况的写法了,我们加上初始化数据的代码

public class CustomTextView extends AppCompatTextView {
    public CustomTextView(Context context) {
        super(context);
        init();
    }

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

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

    /**
     * 初始化数据
     */
    private void init(){

    }
}

就目前情况,我们不清楚程序到底执行哪个构造方法,所以我们需要在每个构造方法里面都加上我们的初始化方法。

以上代码看起来比较繁琐,那么有没有什么办法优化呢?

首先我们需要了解自定义view的构造方法的执行时机

  • 当使用xml初始化view时,默认调用第二个构造方法
  • 其他构造方法基本都是用new关键字使用的;

了解构造方法的执行时机之后,开始思考用什么办法来简化代码?

我们可以使用层级的方式,也就是说,第一个构造方法调用第二个构造方法,第二个方法调用第三个构造方法,以次类推,最后一个构造方法依然调用父类的构造方法。

在这里需要掌握一个技巧,我们看一下父类的构造方法

图片.png

我们发现父类的构造方法已经是层级调用了, 所以我们将代码拷贝到上层就可以了。

调整后的代码如下

public class CustomTextView extends AppCompatTextView {
    public CustomTextView(Context context) {
        this(context, null);
    }

    public CustomTextView(Context context, AttributeSet attrs) {
        this(context, attrs, android.R.attr.textViewStyle);
    }

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

    /**
     * 初始化数据
     */
    private void init(){

    }
}

看到这里,有关层级调用的方法掌握了吗?

补充:

  • this() ---- 调用当前类的构造方法
  • super() ---- 调用父类的构造方法

相关文章

网友评论

    本文标题:自定义View之构造方法

    本文链接:https://www.haomeiwen.com/subject/obvnyqtx.html