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

时间:2012-02-09 14:58:25

标签: android android-webview html-select

大约一年前有人问similar question,并没有完全解决,但无论如何我都会试试运气,也许有人知道这一点。

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

  

线程[< 1> main](暂停(异常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)line:not available [native method]
      Method.invoke(Object,Object ...)行:507
      ZygoteInit $ MethodAndArgsCaller.run()行:840
      ZygoteInit.main(String [])行:598       NativeStart.main(String [])行:不可用[本机方法]

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

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

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

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

没有任何帮助。

有没有人对导致这种情况的原因有任何线索?

5 个答案:

答案 0 :(得分:3)

实际上,您所做的就是将应用程序上下文传递给了webview。 SELECT标签基本上使用Android的原生 AlertDialog 显示其选项,需要活动上下文

要解决此问题,您可以通过布局(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>
  

工具:上下文= “com.myApp.Activities.WebViewActivity”

答案 1 :(得分:1)

崩溃是因为您已将ApplicationContext提供给网页视图。 单击SELECT标记后,Android会在内部使用本机AlertDialog显示其选项 必须使用Activity上下文创建Webview,因为AlertDialog实例需要Activity上下文。

答案 2 :(得分:1)

就我而言,我使用的是androidx,我所做的就是将所有gradle实现更新为最新版本。根据Playstore指南,我将2020年11月以后的最低版本的compileSDK版本更改为29。而且对我来说很好。

答案 3 :(得分:0)

在网上浏览了一个多月之后,我已经放弃并将所有SELECT转发给本机代码。

将SELECT替换为类似于SELECT的东西,绑定在JavascriptInterface上启动方法的click处理程序并将SELECTs选项值传递给它,让方法打开Dialog {{1}填充组RadioGroup代表选项。选择后,解析索引并将其传递回JavaScript(启动该过程的SELECT实例应首先保存在某些var中)。

这很难看,但遗憾的是其他任何事情似乎都没有用。

答案 4 :(得分:0)

比赛结束,但我已经阅读了半个工作日,并在几个工作日内尝试了不同的解决方案,并一遍又一遍地回到这个线程。我有一个带有Webview的片段,而在Oreo(28)之前安装的Android版本在选择HTML中的选择时崩溃了,而28+则忽略了它。

Diffy 表示什么, Igor_K 表示(尽管Diffy的解决方案不起作用):它是错误的背景。让我解决的是this thread。我将复制粘贴下面的答案:

对这个答案充满热爱 Manish Sharma

  

要将新上下文传递给webview,您可以创建一个初始化方法   webview,传递Context的参数,如下所示:

public static Webview initializeWebView(Context context)
{

  myWebView = new WebView();
  return myWebView;

}
  

在此之后,您可以随意调用此方法   无论你什么时候想要。你可以这样调用,如下所示:

myWebView = initializeWebView(YourActivityName.this);
//this way whatever Context you will pass your webview will be initialized that way
//for example you can also pass getApplicationContext() as an Argument
myWebView = initializeWebView(getApplicationContext());
//or
myWebView = initializeWebView(customContext);
  

此customContext可以是从其他继承的任何上下文   您想要使用的上下文。