前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于安卓自定义 View 设计的坑点漫谈

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

作者头像
萬物並作吾以觀復
发布2019-06-15 11:12:07
7420
发布2019-06-15 11:12:07
举报
文章被收录于专栏:指尖下的Android指尖下的Android

今天遇到一个问题,有测试反馈移动端 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();
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.06.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档