[鸿蒙开发]鸿蒙开发踩坑一: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
回复
相关推荐
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对象成功。
老师凌晨回复,也太详细了吧~赞
老师回复的太详细了,感谢老师。一下子收获了很多知识。