分割レイアウト (左側にリスト、右側に詳細ペイン) を持つタブレット アプリケーションがあります。右側のペインは WebView で、<video>
タグが含まれています。WebView の右側全体が切り取られ、真っ白にレンダリングされることを除いて、すべて正常に機能しています。
このようにレンダリングされるのはなぜですか? また、巨大なハックを挿入せずにそれを回避するにはどうすればよいですか?
githubに投稿した単純なテスト プロジェクトに煮詰めました。
これがスクリーンショットです: http://d.pr/i/dfEh .
左側の灰色の領域は、リスト ビューが属する場所です。FrameLayout
簡単 にするために空に変更しました。WebViewの右側に沿って切り取られた部分は、リスト ビューと同じ幅です。 また、ビデオの下のコンテンツも切り取られていることに注意してください。白い領域は、WebView の高さ全体に広がっています。
私が試したいくつかのこと:
- リストビューを別のものに置き換える
- 有効化と無効化
WebSettings
: JavaScript、ワイド ビューポートの使用、オーバービュー モードでの読み込み WebViewClient
aと a を設定するWebChromeClient
- ハードウェア アクセラレーションのオンとオフを切り替える
View.setScrollBarStyle
、WebView.setVerticalScrollBarOverlay
などのさまざまな設定<video>
の高さ/幅の属性とスタイルを微調整します- h264 と aac を使用した mp4、m3u8、YouTube rtsp ストリームなど、さまざまなビデオ形式
- 表示されている Fire HD、Nexus 7、Galaxy 10.1、Xoom などのさまざまなデバイス
- Android バージョン 3.1、3.2、4.0、4.1
現在の回避策:
全画面表示の WebView を使用し、その上にリスト ビューをオーバーレイし、html の最も外側のコンテナー要素に左マージンを設定することで、この問題を回避しました。これはかなりハックであり、さまざまな密度と解像度でリスト ビューのサイズを取得するとエラーが発生しやすくなるため、これを正しい方法で解決したいと考えています。
切れ端:
前述したように、(非) 動作中のテスト ベッドが github に投稿されていますが、重要な点は次のとおりです。
WebView に読み込まれた Html (これがすべてです):
<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;
私は本当にこれについて頭を悩ませています、そして私はそれについての言及を見つけることができなかったことに驚いています. どんな意見も歓迎しますが、とてつもないことでも構いません。