12

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

在中加载一些 HTML 后WebView,我收到以下内容:

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 元素呢?一般来说,有没有一种方法可以在不放弃布局和一次滚动所有内容的情况下解决这样的问题?

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

4

5 回答 5

16

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

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

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

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

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

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

2015 年 4 月更新

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

于 2014-01-15T18:06:34.087 回答
3

webView.setLayerType(WebView.LAYER_TYPE_NONE, null);

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

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

于 2016-02-10T09:08:03.840 回答
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>

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

于 2016-05-24T16:09:27.593 回答
-2

I created something similar and all I needed was to add this to my WebView:

android:layout_height="match_parent"
于 2013-08-27T17:38:56.457 回答
-3

这对我有用:

<WebView
        android:id="@+id/wv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="horizontal"/>
于 2013-11-18T13:20:20.987 回答