大约一年前有人问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仍会崩溃。 从一年前的问题中提到的一些事情,我确实尝试过:
没有任何帮助。
有没有人对导致这种情况的原因有任何线索?
答案 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可以是从其他继承的任何上下文 您想要使用的上下文。