2013-08-27 1 views
10

У меня есть макет с ScrollView, который содержит следующие виды: ImageView, TextView, WebView, TextView. (Это потому, что я хотел бы, чтобы просмотреть все вместе, а не только содержимое WebView)WebView в ScrollView: «Просмотр слишком большой, чтобы вписаться в кеш-файл» - как переделать макет?

После загрузки некоторых 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 ... Я имею в виду , конечно, можно было разместить содержимое ImageView s и TextView s в WebView, но как насчет Button или каких-либо других элементов интерфейса, требующих взаимодействия? Есть ли способ вообще, который мог бы решить такие проблемы, не отказываясь от макета и прокручивая все сразу?

Я узнал, что я не единственный, у кого проблема. Для других примеров, проверить эти вопросы - без рабочего раствора еще:

+0

попробуйте материал в этом ответе: http://stackoverflow.com/a/5274400/507810, чтобы отключить прокрутку в WebView. Это может улучшить ситуацию. Тем не менее, это часть выстрела в темноте. – FoamyGuy

+0

У меня была эта проблема, когда я случайно поместил один прокручиваемый вид внутри другого прокручиваемого вида/контейнера. Решение заключалось в том, чтобы поменять контейнер на LinearLayout. Для получения дополнительной информации см. Мой комментарий ниже этого ответа: https://stackoverflow.com/a/37418736/1617737 –

ответ

14

Проблема, как представляется, связана с аппаратным ускорением, который включен по умолчанию, если уровень API является> = 14.

У меня есть приложение с ScrollView, который содержит ряд представлений, которые я хочу, чтобы просмотреть, как единый блок, похожий на оригинальный плакат - одно из этих представлений - это веб-представление, которое обертывает его содержимое. Если аппаратное ускорение включено и оказаноWebView совсем не сложно (изображения, границы и т. Д.), То сообщение об ошибке кэша чертежа можно увидеть в LogCat. На одном экране с 12 элементами работал, а следующий экран с 13 элементами не работал. Я не думаю, что это количество элементов, которые имеют значение, но сложность финального визуализированного экрана.

Симптомы обычно являются пустым WebView - другие виды визуально присутствуют и полностью сформированы. Очень редко я вижу весь экран пустым, но это, возможно, было, пока я был futzing с различными предложениями, найденными здесь на SO.

Сообщение не всегда видно. Например, я вижу проблему на Samsung Galaxy 4 Mini 4.2.2, в то время как на других устройствах 4.x, таких как мой дешевый китайский клон Samsung S3, работающий на 4.1.2, все в порядке. Я не видел его на каких-либо устройствах 1.x или 2.x.

Я попытался выборочно отключить аппаратное ускорение на различных представлениях и макетах в иерархии представлений, но в конце концов просто повернул аппаратное ускорение для всего приложения в файле манифеста из-за разочарования и посмотрел, сколько часов я потратил впустую отслеживая это.

После отключения аппаратного ускорения все проблемы исчезли. Я не вижу заметных различий в производительности на любом из моих устройств. Предположительно, устройства 1.x и 2.x никогда не использовали аппаратное ускорение в первую очередь, а мои 4.x-устройства должны быть достаточно быстрыми, чтобы справляться с программным рендерингом. Не то, чтобы мои экраны были сложными.

Обновление апреля 2015

К сожалению, предупреждающее сообщение возвращается на Samsung Galaxy Mini 4 в настоящее время работает 4.4.2 даже аппаратное ускорение отключено. У меня есть веб-просмотр с открытой/закрытой анимацией на панели JavaScript. Все работает отлично, за исключением того, что первоначальный макет (панель открыта) вызывает эти предупреждения, и каждый раз, когда я закрываю или открываю панель, я также получаю их. Эти предупреждения сейчас просто раздражают, приложение работает нормально.

+2

Работает для меня с android: hardwareAccelerated = "false". Спасибо. – duanbo1983

+0

Ты спас меня. Благодаря! – mr5

+0

да, но если вы делаете андроид: hardwareAccelerated = "false", тогда встроенные видео html5 не будут воспроизводиться в веб-просмотре ......... – aimiliano

-2

я создал нечто подобное, и все, что мне было нужно, чтобы добавить это мой WebView:

android:layout_height="match_parent" 
+0

Извините, но я не думаю, что это решит проблему с кэшем чертежа; Фактически, я уже использую это в своей проблемной версии. – Scorchio

-3

Это работает для меня:

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

webView.setLayerType(WebView.LAYER_TYPE_NONE, null);

работал для меня. В зависимости от аппаратного обеспечения для дополнительного буферного экрана нет памяти, так как 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> 

Обратите внимание, что это может иметь отрицательные последствия, поскольку рендеринг в программном обеспечении обычно медленнее.

+0

Игнорировались, так как этот ответ сработал для меня, но производительность не показалась вам отличной. Затем я понял, что для меня что-то не так, чтобы получить ** View слишком большой, чтобы вписаться в рисование кеша ** в первую очередь ... Тогда мне стало понятно, что у меня есть «ListView» (который прокручивается в любом случае) в 'NestedScrollView'. Поэтому я изменил «NestedScrollView» на «LinearLayout», и теперь он отлично работает - без каких-либо необходимости «android: layerType =» software ». –