2013-12-01 2 views
1

Я показываю математические выражения в webview (используя библиотеку jqmath и некоторый CSS). Одним из требований является то, что выражения должны быть в центре, и вот что я использую, чтобы добиться того, что:Содержание центра в android 4.4 webview

<html><head><style type='text/css'>html,body {margin: 0;padding: 0;width: 100%;height: 100%;}html {display: table;}body {display: table-cell;vertical-align: middle;text-align: center;}</style></head><body><p>here goes the expression</p></body></html> 

С рендерингом математики занимает некоторое время, то WebView скрыт в то время как выражение рендеринг, и отображается только тогда, когда он готов к работе (как только вызывается onPageFinished WebViewClient). Это хорошо работало до Android 4.4.

Проблема с новым веб-просмотром заключается в том, что он применяется только к CSS, когда он виден на экране. Таким образом, после выявления скрытого веб-представления выражение сначала появляется в верхнем левом углу, и только через ~ 0,1 секунды «прыгает» в центр. Это выглядит уродливо, так как я должен быстро отображать множество выражений.

В этом вопросе описывается связанная проблема: width:100% in CSS not rendering well in Android 4.4. Ответчик смог решить свою проблему, удалив display: table; из html, но это не работает в моем случае.

Так есть ли способ либо: (а) заставить новую (на основе хрома) WebView для отображения контента в то время как не видно, или (б) отображать содержимое в центре с самого начала (без сначала отображая его в верхнем левом углу).

+0

Что такое LayoutParams - это ваш WebView, прикрепленный к иерархии вида с помощью? Как сделать его видимым/невидимым? Любая другая специальная конфигурация? – ksasq

ответ

2

Это не правда, что WebView KK применяет CSS только тогда, когда видны на экране:

  • WebView не будет сам по себе размер, если он видимость установлен GONE, поскольку Android структура будет вызывать методы компоновки, связанные с на нем (например, layout и onSizeChanged). Это может быть то, что вы видите. Попробуйте установить видимость на INVISIBLE.

  • WebViewClient.onPageFinished не является надежным триггером для показа вашего WebView. Что действительно означает обратный вызов, так это то, что ресурс для основного фрейма был загружен из сети. К сожалению, никогда не было надежного обратного вызова, который бы сказал вам, что «ваш контент готов к отображению» - то, что вы описываете, вероятно, произошло из-за определенного времени. Самый надежный способ не показывать незавершенный контент - это сделать это в HTML/CSS.

  • Возможно, вы используете WebView.loadDataWithBaseUrl, чтобы загрузить ваше содержимое в новый/пустой WebView. Этот API имеет эффект, похожий на повторную запись содержимого страницы (вместо выдачи «реальной» навигации) и может привести к странным раскладка. Если возможно, используйте loadData или loadUrl. Если ни один из них не является выполнимым, попробуйте позвонить loadUrl("data:text/html,<body style=\"margin: 0px;\"/>"); перед загрузкой реального контента (подождите по крайней мере, пока не получите обратный вызов WebViewClient.onPageStarted для этого загрузочного URL-адреса).

  • возможно установка высота до WRAP_CONTENTS. Это вряд ли вызовет проблемы, которые вы описываете, но было бы неплохо исключить. Попробуйте установить ширину MATCH_PARENT и высоту с фиксированным количеством пикселей.

+0

Да, ваш ключ номер 1 решил проблему. У меня был веб-просмотр, завернутый в фрагмент, и спрятал/показал этот фрагмент по мере необходимости с помощью фрагментации. Однако метод hide() фрагментации trtransaction фактически устанавливает представление фрагмента GONE. Поэтому необходимо применить myFragment.getView().setVisibility (View.INVISIBLE) перед загрузкой любого контента. Интересно, что это не было необходимо перед KK. – k29

Смежные вопросы