自定义控件

高级UI<第三十六篇>:自定义View之构造方法

2020-01-22  本文已影响0人  NoBugException

在我们编写自定义view时第一件事总是编写构造方法,我之所以将自定义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(){

    }
}

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

以上代码看起来比较繁琐,那么有没有什么简单的方法呢?

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

最终代码如下:

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(){

    }
}

【补充】

注释的中文翻译是:

从XML中展开视图时调用的构造函数。这叫做从XML文件构造视图时,提供在XML文件中指定的属性。此版本使用默认样式0,因此应用的唯一属性值是上下文主题中的那些值以及给定的属性集。

在添加了所有子项之后,将调用onFinishInflate()方法。

[本章完...]

上一篇 下一篇

猜你喜欢

热点阅读