2012-10-26 43 views
11

Tôi có ứng dụng máy tính bảng có bố cục phân tách - danh sách ở bên trái và ngăn chi tiết ở bên phải. Khung bên phải là một WebView và nó chứa một thẻ <video>. Đó là tất cả làm việc tốt, ngoại trừ toàn bộ bên phải của WebView được cắt bỏ và làm cho màu trắng đồng bằng.WebView một phần màn hình với <video> được cắt thành một nửa

Tại sao nó hiển thị theo cách này và làm thế nào tôi có thể tránh nó mà không chèn một hack lớn?

Tôi đã đun sôi nó xuống một dự án thử nghiệm đơn giản, mà tôi đã đăng on github.

Đây là ảnh chụp màn hình: http://d.pr/i/dfEh.

Khu vực màu xám ở bên trái là nơi chế độ xem danh sách thuộc về. Tôi đã đổi nó thành một số trống FrameLayout để đơn giản. Phần cắt ngang dọc theo bên phải của WebView IS cùng chiều rộng với chế độ xem danh sách. Cũng đáng lưu ý rằng mọi nội dung bên dưới video cũng bị cắt - vùng trắng mở rộng chiều cao đầy đủ của WebView.

Một số điều tôi đã cố gắng:

  • thay thế xem danh sách với cái gì khác
  • kích hoạt và vô hiệu hóa WebSettings: javascript, sử dụng khung nhìn rộng, tải với chế độ tổng quan
  • thiết lập một WebViewClientWebChromeClient
  • bật và tắt tăng tốc phần cứng
  • các thiết lập khác nhau NGS trong View.setScrollBarStyle, WebView.setVerticalScrollBarOverlay, và tương tự
  • tinh chỉnh
  • thiết bị khác nhau chiều cao/thuộc tính chiều rộng và phong cách
  • các định dạng video khác nhau, bao gồm mp4 với h264 và aac, M3U8 's <video>, và một dòng rtsp youtube, bao gồm Fire HD cho thấy, Nexus 7, một Galaxy 10.1 và Xoom
  • phiên bản Android 3.1, 3.2, 4.0, 4,1

workaround hiện tại:

0.123.

Tôi đã kết thúc làm việc này bằng cách sử dụng WebView toàn màn hình, phủ lên chế độ xem danh sách của tôi trên đầu trang và đặt lề trái trên phần tử vùng chứa ngoài cùng trong html. Điều này là khá hacky, và nhận được kích thước của danh sách xem trên mật độ khác nhau và độ phân giải là dễ bị lỗi, vì vậy tôi thực sự muốn giải quyết điều này đúng cách.

Snippets:

Như tôi đã đề cập, một (không) giường kiểm tra làm việc được đăng tải trên github, nhưng ở đây là các bước quan trọng:

Html nạp vào WebView (đây là TẤT CẢ nó):

<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> 

Các chính bố trí tập tin:

<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> 

Trong 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; 

Tôi thực sự gãi đầu của tôi trên thế này, và tôi ngạc nhiên tôi đã không thể tìm thấy bất kỳ đề cập đến nó. Bất kỳ đầu vào nào được đánh giá cao, tuy nhiên được tìm nạp nhiều.

+0

Bạn đã cân nhắc sử dụng lớp phủ VideoView thay vì nhúng video vào chế độ xem web chưa? – Phil

+0

Nếu video trên webview giống như một VideoView, video đó sẽ nằm trên một Bề mặt, có thể chỉ là một mặt, do đó bạn đã thử tắt tăng tốc phần cứng ListView. –

+0

@nininho: Điều này nghe có vẻ đầy hứa hẹn. Tôi đã thử đặt 'view.setLayerType (View.LAYER_TYPE_SOFTWARE, null);' trong 'onCreateView' của phân đoạn danh sách, nhưng không có thay đổi. Có hoặc không có cuộc gọi đó, một cuộc gọi đến kết quả 'getLayerType' trong' LAYER_TYPE_NONE' trên cả danh sách và lượt xem web. Có cách nào khác để yêu cầu một lớp phần mềm không?Tắt tăng tốc ở cấp ứng dụng sẽ khắc phục sự cố bố cục, nhưng tất nhiên khiến video không hiển thị. – dokkaebi

Trả lời

1

Sự cố có vẻ là với lớp phần cứng/opengl. Vì VideoView sử dụng lớp phần cứng để hiển thị video, tôi tin rằng điều tương tự cũng xảy ra với webView với video. Vì vậy, nếu bạn thiết lập các lớp bên phải, chúng không nên can thiệp lẫn nhau, vì vậy như tôi đã nói trên coments, bạn nên đặt ListView để lớp không có hoặc phần mềm, để vô hiệu hóa tăng tốc phần cứng và kích hoạt nó trên webView hoặc cửa sổ. Thông tin

Thông tin thêm về tăng tốc phần cứng tại http://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling

1

tôi đã cùng một vấn đề, nó đã phải với tôi sử dụng một cách bố trí tương đối. Lớp nó hiển thị video, không di chuyển với chế độ xem web. Vì vậy, nó sẽ làm cho video như thể webview được đặt ở 0,0.

Bạn có thể giải quyết vấn đề này bằng cách thực sự định vị webview ở 0 0, sau bất kỳ thành phần nào có thể đã có ở đó. Sau đó, trong css cung cấp cho nội dung một lề để định vị nó trên đúng vị trí.

Nó có thể không sạch sẽ, nhưng tôi đã không tìm thấy giải pháp khác.

EDIT: Sau khi xem xét kỹ hơn câu hỏi của bạn, tôi nghĩ rằng nó không có liên quan gì đến bố cục tương đối khi bạn không sử dụng. Tuy nhiên cách giải quyết này làm việc cho tôi. Vì vậy, tôi đoán 'Lớp video' ở mức 0,0 bất kể bố cục bạn đang sử dụng là gì. Tôi chỉ gặp vấn đề này trên Galaxy Tab 2 (android 4.0.3) bằng cách này.

-1

Tôi gặp vấn đề tương tự trong bố cục luồng chính/chi tiết. Bằng cách thiết lập loại lớp cho phần mềm, video của tôi bị cắt giảm một nửa các vấn đề đã biến mất. Điều này sẽ tắt tăng tốc phần cứng cho chế độ xem web.

webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

FYI Tôi chỉ gặp phải sự cố này trên Amazon Tablets.

Các vấn đề liên quan