【问题标题】:WebView in ScrollView: "View too large to fit into drawing cache" - how to rework layout?ScrollView 中的 WebView:“视图太大,无法放入绘图缓存” - 如何重新设计布局?
【发布时间】:2016-05-25 00:57:16
【问题描述】:

我有一个带有ScrollView 的布局,其中包含以下视图:ImageViewTextViewWebViewTextView。 (这是因为我想将整个一起滚动,而不仅仅是WebView的内容)

WebView 中加载一些 HTML 后,我收到以下信息:

WARN/View(632): View too large to fit into drawing cache, needs 14236800 bytes, only 1536000 available

...WebView 的内容不会显示。删除ScrollView 后,警告消失了,一切都很好,除了我失去了想要的滚动功能。

首先:我知道尝试在另一个 ScrollView 中使用 ScrollView 通常是一件坏事,但我不能 100% 确定在每种情况下都有等效的解决方案不使用ScrollView...我的意思是,当然可以将ImageViews 和TextViews 的内容放入WebView,但是Buttons 或任何其他需要交互的UI 元素呢? 有没有一种方法可以在不放弃布局和一次滚动所有内容的情况下解决此类问题?

我发现我不是唯一遇到此问题的人。对于其他示例,请检查这些问题 - 尚无有效解决方案:

【问题讨论】:

  • 试试这个答案中的东西:stackoverflow.com/a/5274400/507810 禁用 WebView 上的滚动。这可能会改善情况。不过,这对我来说有点像在黑暗中拍摄。
  • 我无意中将一个可滚动视图放入另一个可滚动视图/容器时遇到了这个问题。解决方案是将容器更改为 LinearLayout。有关更多详细信息,请参阅我在此答案下方的评论:stackoverflow.com/a/37418736/1617737

标签: android drawingcache


【解决方案1】:

该问题似乎与默认启用的硬件加速有关,如果 API 级别 >= 14。

我有一个带有 ScrollView 的应用程序,其中包含许多视图,我想将它们作为一个单元滚动,类似于原始海报 - 其中一个视图是包含其内容的 Web 视图。如果硬件加速开启并且 rendered WebView 非常复杂(图像、边框等),则可以在 LogCat 中看到绘图缓存错误消息。一些有 12 个项目的屏幕工作,而下一个有 13 个项目的屏幕不工作。我不认为它的项目数量会有所不同,而是最终渲染屏幕的复杂性。

症状通常是空白WebView - 其他视图在视觉上呈现并完整形成。偶尔我会看到整个屏幕是空白的,但这可能是在我对 SO 上的各种建议感到困惑的时候。

消息并不总是可见。例如,我在运行 4.2.2 的三星 Galaxy 4 Mini 上看到了这个问题,而在其他 4.x 设备上,比如我的廉价中国三星 S3 克隆运行 4.1.2,一切都很好。我没有在任何 1.x 或 2.x 设备上看到它。

我尝试有选择地关闭视图层次结构中各种视图和布局的硬件加速,但最终出于沮丧和查看我浪费了多少小时跟踪而在清单文件中关闭了整个应用程序的硬件加速这个下来了。

关闭硬件加速后,所有问题都消失了。我在我的任何设备上都没有发现明显的性能差异。大概 1.x 和 2.x 设备从一开始就没有使用硬件加速,而我的 4.x 设备必须足够快才能处理仅软件渲染。并不是说我的屏幕有那么复杂。

2015 年 4 月更新

不幸的是,即使关闭了硬件加速,现在运行 4.4.2 的三星 Galaxy 4 Mini 仍会出现警告消息。我有一个带有 JavaScript 面板打开/关闭动画的 webview。一切正常,除了初始布局(面板打开)引发这些警告,每次我关闭或打开面板时,我也会得到它们。这些警告现在只是烦人,应用程序运行良好。

【讨论】:

  • 适用于我的 android:hardwareAccelerated="false"。谢谢。
  • 是的,但如果你做 android:hardwareAccelerated="false" 那么嵌入的 html5 视频将不会在 webview 中播放............
  • 当我将 webview 的层类型更改为使用软件层(默认为硬件)时发生这种情况:mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
  • 对于任何面临像@HugoGresse 这样的问题的人,我在 webviews 和 recycler view 方面遇到了类似的问题。我必须在 webviews 和 recycler 视图中打开软件层,之后一切正常
【解决方案2】:

webView.setLayerType(WebView.LAYER_TYPE_NONE, null);

为我工作。根据硬件的不同,当 WebView 嵌入到另一个滚动视图中时,会完全呈现 WebView,因此没有剩余内存可用于额外的屏幕外缓冲区。

我认为它是 Android 中的一个错误,它不会自动回退到这个(较慢,但有效)选项。

【讨论】:

    【解决方案3】:

    正如其他答案所述,当硬件加速处于活动状态时会出现问题。但是关闭整个应用程序的硬件加速对我来说不是解决方案。

    我想我可以通过将android:layerType="software" 设置为ScrollView 来解决问题,这只是禁用ScrollView 及其内容的硬件加速。

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layerType="software">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
    
            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                ...
            </FrameLayout>
    
            <WebView
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
    
        </LinearLayout>
    
    </ScrollView>
    

    请注意,这可能会对性能产生负面影响,因为在软件中渲染通常较慢。

    【讨论】:

    • 投了赞成票,因为这个答案对我有用,但性能似乎并不好。然后我意识到我必须首先得到 View too large to fit into drawing cache 警告……然后我突然意识到我有一个ListView(无论如何都是可滚动的)在NestedScrollView。所以我将NestedScrollView 更改为LinearLayout,现在它可以完美运行——不需要android:layerType="software"
    【解决方案4】:

    我创建了类似的东西,我只需要将它添加到我的WebView

    android:layout_height="match_parent"
    

    【讨论】:

    • 对不起,但我不认为它会解决绘图缓存的问题;事实上,我已经在有问题的版本中使用了它。
    【解决方案5】:

    这对我有用:

    <WebView
            android:id="@+id/wv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="horizontal"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多