在ScrollView的WebView:“查看太大,以适应绘图caching” – 如何重新布局?

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

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

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

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

首先:我知道在另一个ScrollView使用ScrollView是一件很糟糕的事情 ,但我不能100%确定在任何情况下都有一个没有使用ScrollView的等效解决scheme…我的意思是,当然可以把ImageViewTextView的内容到WebView ,但WebView或其他需要交互的UI元素呢? 有没有一种方法可以解决这样的问题,而不放弃布局和一次滚动的一切?

我发现我不是唯一有这个问题的人。 对于其他示例,请检查这些问题 – 尚无解决scheme:

  • WebView和GridView转换成ScrollView,View太大,不适合绘制caching
  • Android – 查看太大以适应绘图caching

Solutions Collecting From Web of "在ScrollView的WebView:“查看太大,以适应绘图caching” – 如何重新布局?"

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

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

症状通常是一个空白的WebView – 其他视图可视化呈现和完整形成。 偶尔我看到整个屏幕都是空白的,但是这可能是我在SO上发现的各种build议的时候。

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

我试图有select地closures视图层次结构中不同视图和布局的硬件加速,但是最终只是把清单文件中的整个应用程序的硬件加速转变为无奈,并且看到我浪费了多less时间来跟踪这个过程。

closures硬件加速后,所有问题都消失了。 我看不到任何设备上的性能差异。 推测1.x和2.x设备从来没有使用硬件加速,我的4.x设备必须足够快,以应付软件只渲染。 不是说我的屏幕很复杂

更新2015年4月

不幸的是,即使在硬件加速closures的情况下,三星Galaxy 4 Mini现在也运行了4.4.2的警告信息。 我有一个JavaScript面板打开/closuresanimation的Web视图。 一切工作正常,但最初的布局(面板打开)引发这些警告,每次我closures或打开面板,我也得到了他们。 这些警告现在只是烦人的,应用程序工作正常。

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

我想我可以通过设置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> 

请注意,这可能会带来负面的性能影响,因为在软件中渲染通常比较慢。

webView.setLayerType(WebView.LAYER_TYPE_NONE, null);

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

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

我创build了类似的东西,我需要的只是添加到我的WebView

 android:layout_height="match_parent" 

这适用于我:

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