[鸿蒙开发]鸿蒙开发踩坑一:WebView报空指针

甜甜爱开发
发布于 2021-9-18 15:36
浏览
3收藏

今天学习WebView相关的知识,实践的时候一直报WebView空指针,最后排查发现是布局文件的问题。
原先的布局文件

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical">

    <WebView
        ohos:id="$+id:webview"
        ohos:height="match_parent"
        ohos:width="match_parent"/>

</DirectionalLayout>

这里是按照Android习惯,直接写的WebView,而正确的应该是把WebView的全路径写出来才不会报空指针

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical">

    <ohos.agp.components.webengine.WebView
        ohos:id="$+id:webview"
        ohos:height="match_parent"
        ohos:width="match_parent"/>

</DirectionalLayout>

具体原因有大佬知道吗?求指导

4
收藏 3
回复
举报
3条回复
按时间正序
/
按时间倒序
裴云飞1
裴云飞1

1、我们在布局文件里面写的组件,系统是如何把这些组件对象创建出来的呢?是在我们调用findComponentById方法时创建的吗?当然不是。findComponentById方法仅仅是用来查找组件对象的,findComponentById方法并不是用来创建组件对象的。系统是在解析布局文件的时候,通过反射来创建组件对象的。既然是使用反射创建对象,那就需要知道组件的包名和类名,包名和类名缺一不可。

2、但是,我们在布局文件写Text、Image等这些组件的时候,并没有加上这些组件的包名,系统在创建这些组件对象的时候,为什么不会出问题呢?那是因为这些组件都有相同的包名,包名都是ohos.agp.components。如果我们在布局文件中写的组件,组件没有加上包名,那系统就会默认给组件加上ohos.agp.components这个包名。如果我们在布局文件中写的组件,组件带上了包名,那系统在创建组件对象的时候,就不会添加ohos.agp.components这个包名。

3、回到你问的问题,你直接在布局文件中写的WebView并没有加上包名,系统在创建对象的时候,就会添加ohos.agp.components这个包名。但是WebView包名并不是ohos.agp.components,而是ohos.agp.components.webengine,包名错了,反射创建对象就会失败,通过findComponentById方法查找WebView对象,WebView对象自然就空了。

4、在布局文件中写我们自定义的组件,也需要加上包名,原因就在这。

5、对于安卓的组件来说,有三个包名,分别是android.widget,android.view以及android.webkit。TextView、ImageView等组件的包名是android.widget,View的包名是android.view,WebView的包名是android.webkit。安卓系统把这三个包名放到了一个数组里面,创建对象的时候,遍历数组,得到包名,通过包名加类名的方式创建对象。就拿WebView来说,第一次遍历数组得到的包名是android.widget,WebView的包名是android.webkit,此时创建WebView对象失败。创建对象失败,就继续遍历数组,第二次遍历得到的包名是android.widget,创建WebView对象依然失败。第三次遍历得到的包名是android.webkit,创建WebView对象成功。

已于2021-9-22 16:23:56修改
4
回复
2021-9-22 01:02:31
Der_带鱼
Der_带鱼 回复了 裴云飞1
1、我们在布局文件里面写的组件,系统是如何把这些组件对象创建出来的呢?是在我们调用findComponentById方法时创建的吗?当然不是。findComponentById方法仅仅是用来查找组件对象的,findComponentById方法并不是用来创建组件对象的。系统是在解析布局文件的时候,通过反射来创建组件对象的。既然是使用反射创建对象,那就需要知道组件的包名和类名,包名和类名缺一不可。 2、但是,我们在布局文件写Text、Image等这些组件的...

老师凌晨回复,也太详细了吧~赞

回复
2021-9-22 08:49:14
甜甜爱开发
甜甜爱开发 回复了 裴云飞1
1、我们在布局文件里面写的组件,系统是如何把这些组件对象创建出来的呢?是在我们调用findComponentById方法时创建的吗?当然不是。findComponentById方法仅仅是用来查找组件对象的,findComponentById方法并不是用来创建组件对象的。系统是在解析布局文件的时候,通过反射来创建组件对象的。既然是使用反射创建对象,那就需要知道组件的包名和类名,包名和类名缺一不可。 2、但是,我们在布局文件写Text、Image等这些组件的...

老师回复的太详细了,感谢老师。一下子收获了很多知识。

回复
2021-9-23 09:28:00
回复
    相关推荐