美文网首页安卓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