关于安卓自定义 View 设计的坑点漫谈

2019-06-15 11:12:07 浏览数 (1)

今天遇到一个问题,有测试反馈移动端 H5 页面点击输入框软键盘不弹起,然后我检查了一下代码,JS是开启了,焦点也默认获取,但是确实是点击没反应,后来发现是自定义 webview 的构造方法出了问题

代码语言:javascript复制
    public X5WebView(Context arg0) {
        this(arg0, null);
     }

    @SuppressLint("SetJavaScriptEnabled")
    public X5WebView(Context arg0, AttributeSet arg1) {
        this(arg0, arg1, 0);
   }

    public X5WebView(Context var1, AttributeSet var2, int var3) {
        super(var1, var2, var3, false);
        init();
    }

我相信很多朋友的项目中大量出现这种类似代码,首先说一下之所以这样写的初衷,这就得先说一下,Java代码的执行流程顺序,当我们实例化一个类时,首先是自上而下,从静态变量、静态代码块、静态方法所有属于类的都先执行,然后再执行非静态变量、代码块和方法,当然还有一种,那就是继承父类是先执行子类静态再父类静态,然后子类非静态再父类非静态,事实上,绝大多数的控件,它们带有三个参数的构造方法第三个参数传递的确实都是 0 ,但是 Webview 不是,第三个参数传递是一个样式 com.android.internal.R.attr.webViewStyle ,所以问题就出在这里,理论上,我们改成 this 能省略父类的执行提高些许速度,但是忽略了并不是所有的父类实现都一样,最后代码改为以下的样子

代码语言:javascript复制
 public X5WebView(Context arg0) {
        super(arg0);
        init();
    }

    @SuppressLint("SetJavaScriptEnabled")
    public X5WebView(Context arg0, AttributeSet arg1) {
        super(arg0, arg1);
        init();
    }

    public X5WebView(Context var1, AttributeSet var2, int var3) {
        super(var1, var2, var3, false);
        init();
    }

0 人点赞