尝试在Android WebView中打开SELECT标记会导致应用程序崩溃

Igo*_* K. 5 android html-select android-webview

一个类似的问题被问大约一年前,并没有完全解决,但我会尽我的运气,无论如何,也许有人知道这一点.

我有这个应用程序在WebView中运行几个HTML页面.一切看起来都不错,工作正常,直到你试图打开一个SELECT标签 - 繁荣,应用程序崩溃.这是一个跟踪堆栈,如果这有帮助:

线程[<1> main](Suspended(异常WindowManager $ BadTokenException))AlertDialog(Dialog).show()行:247
WebView $ InvokeListBox.run()行:7841
WebView $ PrivateHandler(Handler).handleCallback(Message)行: 587
WebView $ PrivateHandler(Handler).dispatchMessage(Message)行:92
Looper.loop()行:130 ActivityThread.main(String [])行:3859
Method.invokeNative(Object,Object [],Class,Class [], class,int,boolean)行:不可用[native method]
Method.invoke(Object,Object ...)行:507
ZygoteInit $ MethodAndArgsCaller.run()行:840
ZygoteInit.main(String [])行:598 NativeStart .main(String [])行:不可用[native method]

(AlertDialog与打开选择框有什么关系超出了我.不,没有与打开警报的SELECT相关联的脚本).

现在,这是最好的部分.我正在测试2台设备上的应用程序,三星Galaxy S2与OS 2.3.3,和摩托罗拉RAZR XT910与OS 2.3.5.在三星上一切都很棒.然而,在RAZR上,上述情况发生了.

CSS和JavaScript的页面相当繁重,但即使删除了所有内容,它也会崩溃.实际上,带有单个SELECT控件的空HTML仍会崩溃.从一年前的问题中提到的一些事情,我确实尝试过:

  • 从HTML中删除所有绝对和固定定位的元素(实际上我删除了整个CSS只是为了看它是否有任何影响 - 它没有).
  • 确保SELECT是由书本编写的,没有伪造的属性/标签.

什么都没有帮助.

有没有人知道可能导致这种情况的最轻微的线索?

whi*_*wks 6

实际上你所做的就是将应用程序上下文传递给 webview。SELECT 标签基本上使用 Android 的本机AlertDialog显示其选项,该对话框需要Activity Context

要解决此问题,您可以通过布局(XML)文件传递活动上下文,如下所示。

<LinearLayout
    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"
    android:orientation="vertical"
    android:fitsSystemWindows="true"
    tools:context="com.myApp.Activities.WebViewActivity">

    <WebView
            tools:context="com.myApp.Activities.WebViewActivity"
            android:layout_width="match_parent"
            android:id="@+id/webView"
            android:layout_height="match_parent"/>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

工具:context =“com.myApp.Activities.WebViewActivity”

  • 6年前你在哪里?:) (3认同)
  • 我一直以为tools:attr只适用于IDE (2认同)

Igo*_* K. 1

在浏览了一个多月的网络后,我放弃了并将所有 SELECT 转发到本机代码。

将 SELECT 替换为类似 SELECT 的内容,绑定启动方法的单击处理程序JavascriptInterface并将 SELECTs 选项值传递给它,让该方法Dialog用 a 打开 a ,用代表选项的 sRadioGroup填充该组。RadioButton选择后,解析索引并将其传递回 JavaScript(启动该进程的 SELECT 实例应首先保存在某个 var 中)。

这太丑陋了,但遗憾的是似乎没有其他办法起作用。