为什么带有HTML select标签的Android OS 8 WebVew会使应用程序崩溃

Den*_*Hui 15 android android-webview android-8.0-oreo

我有一个混合的Cordova Android应用程序,当用户点击我WebView在Android OS 8上运行的下拉框时应用程序崩溃了.我创建了一个带<select>标签的简单页面,问题可以重现.我有一个解决方法是做我自己的弹出警报选择,但只是想知道这是否发生在其他任何人以及这是否是一个OS8 WebView错误.

下面是一个带<select>标签的简单页面

https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_select

下面是我的崩溃日志

11:04:58.643 3208-3208/com.****.****E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.****.****, PID: 3208 android.content.res.Resources$NotFoundException: Resource ID #0x0
    at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:195)
    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2133)
    at android.content.res.Resources.getLayout(Resources.java:1142)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:421)
    at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:416)
    at android.widget.ArrayAdapter.getView(ArrayAdapter.java:407)
    at org.chromium.content.browser.input.SelectPopupAdapter.getView(SelectPopupAdapter.java:53)
    at android.widget.AbsListView.obtainView(AbsListView.java:2372)
    at android.widget.ListView.measureHeightOfChildren(ListView.java:1408)
    at android.widget.ListView.onMeasure(ListView.java:1315)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at com.android.internal.policy.DecorView.onMeasure(DecorView.java:721)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2410)
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1471)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1751)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1386)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6733)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
    at android.view.Choreographer.doCallbacks(Choreographer.java:723)
    at android.view.Choreographer.doFrame(Choreographer.java:658)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Run Code Online (Sandbox Code Playgroud)

我的问题与此不一样

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

更新于2018年1月9日:我还没有解决方案,我的临时解决方法是删除标签并只使用输入.当用户选择此元素时,我们将事件传递给本机代码以弹出用于选择的对话框,并在用户进行选择后更新输入.

更新于2018年3月23日:经过一番调查后,我发现如果WebView在Fragment中,它只会崩溃,而不会在Activity中崩溃.

我发现以下帖子的评论:

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

"当单击SELECT标记时,Android会在内部使用本机AlertDialog显示其选项.必须使用Activity上下文创建Webview,因为AlertDialog实例需要一个Activity上下文."

我相信这是Android中的一个错误,可能无法正确处理Fragment的Context.

2018年4月17日更新:

正如kenyee指出的那样,谷歌表示,这里是https://issuetracker.google.com/issues/77246450

您不能继承资源对象 - 这从未得到支持,只能偶然发生(这就是为什么它现在被标记为已弃用).框架需要了解所有资源对象,以便在加载webview时更新它们(因为webview会向资产管理器添加其他路径).

编辑2018年11月29日 似乎这个问题困扰了很多人.

  • 我尝试过并经过测试的解决方案是不对子资源进行子类化.
  • 更新编译sdk和支持的库版本适用于某些人.
  • 向Resource添加包装类可能有效,我在初步调查期间尝试过这种方法,它解决了Select崩溃问题,当您单击并按住文本视图以弹出"COPY","PASTE"选项时仍然崩溃.

ken*_*yee 2

看起来像这个错误: https ://issuetracker.google.com/issues/77246450

不要子类化资源...显然不会被修复。