Android使用WebView时打开select标签崩溃的解决方案

最近在写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,不然会报错崩溃。

但是通过百度我发现一种解决思路:

  1. 使用new关键字new出一个WebView,叫做webView1,设置WebView构造方法的参数为当前Activity对象,即this。即WebView webView1 = new WebView(this);

2. 使用 LinearLayout linearLayout = findViewById(R.id.linearLayout);获取xmllinearLayout

3. 再使用linearLayout.removeAllViews();方法删掉原xml中的webView

4. 再通过 ViewGroup.LayoutParams layoutParams = findViewById(R.id.webView).getLayoutParams(); 获取铺满屏幕的webview布局。

5. 再通过webView1.setLayoutParams(layoutParams);让new出的WebViewXML中配置的webView布局参数一致,铺满屏幕。 最后使用linearLayout.addView(webView1)添加我们刚new出的构造方法为thiswebView1对象。

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

标签:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code