最近在写Android的时候遇到了一个无头绪的崩溃。
当使用WebView打开HTML5,点击select标签时,会出现崩溃闪退的情况。
查阅百度后发现没有一个可以给得出具体代码的,只给出了很模糊的解决思路,于是自己摸索。
终于解决了。
本问以腾讯X5的第三方WebView组件为例。其余第三方或原生WebView同理。
参考资料:https://www.itdaan.com/blog/2017/05/10/d8b27bec637baf53bf216824e456c357.html
0x0000 问题描述
当在安卓应用的WebView组件中点击下方的HTML5中的select组件时,会出现很抱歉,"XXXX"已经停止工作类似提示。


0x0001 首先配置好XML布局文件
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.MainActivity">
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.tencent.smtt.sdk.WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>0x0002 解决思路
出现这类问题的原因未知,如果没猜错的话,应该是webview的构造函数中应该传递的Activity是当前活跃的Activity,不然会报错崩溃。
但是通过百度我发现一种解决思路:
- 使用new关键字new出一个
WebView,叫做webView1,设置WebView构造方法的参数为当前Activity对象,即this。即WebView webView1 = new WebView(this);
2. 使用 LinearLayout linearLayout = findViewById(R.id.linearLayout);获取xml中linearLayout
3. 再使用linearLayout.removeAllViews();方法删掉原xml中的webView。
4. 再通过 ViewGroup.LayoutParams layoutParams = findViewById(R.id.webView).getLayoutParams(); 获取铺满屏幕的webview布局。
5. 再通过webView1.setLayoutParams(layoutParams);让new出的WebView与XML中配置的webView布局参数一致,铺满屏幕。 最后使用linearLayout.addView(webView1)添加我们刚new出的构造方法为this的webView1对象。
ViewGroup.LayoutParams layoutParams = findViewById(R.id.webView).getLayoutParams();//获取铺满屏幕的webview布局
webView1 = new WebView(this);//必须传递this本身
linearLayout = findViewById(R.id.linearLayout);
linearLayout.removeAllViews();//移除所有组件
webView1.setLayoutParams(layoutParams);//让new出的WebView铺满屏幕
linearLayout.addView(webView1);//添加webView到布局最后再在AndroidManifest.xml中添加以下两个权限即可。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />0x0003 最终效果
现在,select组件已经可以正常使用了。
