今天遇到一个问题,有测试反馈移动端 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();
}