У меня есть приложение для планшета с разделенным макетом - список слева и панель деталей справа. Правая панель представляет собой WebView и содержит тег <video>
. То, что все работает нормально, за исключением всей правой части WebView, отключается и отображает белый цвет.
Почему это делается так, и как я могу избежать этого, не вставляя огромный хак?
Я отложил его до простого тестового проекта, который я опубликовал в github.
Вот снимок экрана: http://d.pr/i/dfEh.
Серая область слева - это вид списка. Я просто изменил его на пустой FrameLayout
. Отрезанная часть по правой стороне WebView IS та же ширина, что и представление списка. Также стоит отметить, что любой контент ниже видео также отключен - белая область расширяет всю высоту WebView.
Некоторые вещи, которые я пробовал:
- заменить вид списка другим.
- включить и отключить
WebSettings
: javascript, использовать широкоэкранный режим, загрузить с режимом обзора - установите a
WebViewClient
и aWebChromeClient
- включить и выключить аппаратное ускорение
- различные настройки в
View.setScrollBarStyle
,WebView.setVerticalScrollBarOverlay
и аналогичные - настроить атрибуты и стили
<video>
height/width - различные видеоформаты, включая mp4 с h264 и aac, m3u8, и поток youtube rtsp.
- различные устройства, включая показанную Fire HD, Nexus 7, Galaxy 10.1 и Xoom
- Android версии 3.1, 3.2, 4.0, 4.1
Текущее обходное решение:
В итоге я обошел это, используя полноэкранный WebView, наложив на него верхний вид списка и установив левое поле на внешний элемент контейнера в html. Это довольно хаки, и получение размера списка в разных размерах и разрешениях является подверженным ошибкам, поэтому я бы очень хотел, чтобы это было правильно.
Отрывки:
Как я уже упоминал, тестовый слой (не) работает на github, но вот важные бит:
Html загружается в WebView (это ВСЕ):
<html>
<head><title>Title</title></head>
<body style="margin:0">
<video x-webkit-airplay="allow" controls="controls" style="width:100%">
<source src="http://clips.vorwaerts-gmbh.de/VfE_html5.mp4"></source>
</video>
</body>
</html>
Основной файл макета:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<fragment android:name="com.concentricsky.android.webviewvideotest.ListFragment"
android:id="@+id/item_list"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<!-- The WebView is attached here -->
<FrameLayout android:id="@+id/detail_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3" />
</LinearLayout>
В onCreateView
:
View rootView = inflater.inflate(R.layout.fragment_detail, container, false);
webView = (WebView) rootView.findViewById(R.id.webview);
webView.setWebChromeClient(new WebChromeClient());
webView.loadUrl("file:///android_asset/test.html");
return rootView;
Я действительно почесываю голову над этим, и я удивлен, что не смог найти упоминания об этом. Любой вход оценивается, как бы надуманный.