ScrollView中的WebView:“视图太大而无法适应绘图缓存” - 如何重新布局?

时间:2013-08-27 16:43:36

标签: android drawingcache

我有一个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一般来说是件坏事,但我不是百分之百确定在每种情况下在没有使用ScrollView的情况下有一个等效的解决方案...我的意思是,当然可以将ImageViewTextView的内容放入WebView,但是Button怎么办? 1}}或任何其他需要交互的UI元素? 有没有一种方法可以解决这样的问题而不放弃布局并一次滚动所有内容?

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

5 个答案:

答案 0 :(得分:16)

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

我有一个带有ScrollView的应用,其中包含许多我想要滚动的视图,它们与原始海报类似,但是其中一个视图是包含其内容的Web视图。如果启用了硬件加速并且呈现 WebView完全复杂(图像,边框等),则可以在LogCat中看到绘图缓存错误消息。一些屏幕有12个项目工作,而下一个屏幕有13个项目不起作用。我不认为它产生差异的项目数量,但最终渲染屏幕的复杂性。

症状通常是空白WebView - 其他视图在视觉上呈现并完整形成。偶尔我看到整个屏幕都是空白的,但这可能是因为我在这里找到了各种各样的建议。

并不总是看到这条消息。例如,我在运行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。一切正常,除了初始布局(面板打开)引发这些警告,每次我关闭或打开面板我也得到它们。这些警告现在很烦人,应用程序运行正常。

答案 1 :(得分: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>

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

答案 2 :(得分:2)

webView.setLayerType(WebView.LAYER_TYPE_NONE, null);

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

我认为这是Android中的一个错误,它不会自动回退到这个(速度较慢但工作正常)的选项。

答案 3 :(得分:-2)

我创建了类似的内容,我只需要将其添加到WebView

android:layout_height="match_parent"

答案 4 :(得分:-3)

这对我有用:

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