最近在写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组件已经可以正常使用了。