Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 带有<;视频>;一分为二_Android_Android Webview_Html5 Video - Fatal编程技术网

Android 带有<;视频>;一分为二

Android 带有<;视频>;一分为二,android,android-webview,html5-video,Android,Android Webview,Html5 Video,我有一个平板电脑应用程序,它有一个拆分布局,左边是一个列表,右边是一个详细信息窗格。右侧窗格是一个WebView,其中包含一个标记。这一切都很好,除了WebView的整个右侧被切断并呈现纯白色 为什么要以这种方式渲染,如何在不插入大量黑客的情况下避免它? 我把它归结为一个简单的测试项目,我已经发布了 这是一个屏幕截图: 左侧的灰色区域是列表视图所属的区域。为了简单起见,我将其更改为空的FrameLayout。网络视图右侧的截断部分与列表视图的宽度相同。还值得注意的是,视频下方的任何内容也会被切断

我有一个平板电脑应用程序,它有一个拆分布局,左边是一个列表,右边是一个详细信息窗格。右侧窗格是一个WebView,其中包含一个
标记。这一切都很好,除了WebView的整个右侧被切断并呈现纯白色

为什么要以这种方式渲染,如何在不插入大量黑客的情况下避免它?

我把它归结为一个简单的测试项目,我已经发布了

这是一个屏幕截图:

左侧的灰色区域是列表视图所属的区域。为了简单起见,我将其更改为空的
FrameLayout
。网络视图右侧的截断部分与列表视图的宽度相同。还值得注意的是,视频下方的任何内容也会被切断——白色区域延伸了网络视图的整个高度

我尝试过的一些事情:

  • 用其他内容替换列表视图
  • 启用和禁用
    WebSettings
    :javascript,使用宽视口,以概览模式加载
  • 设置
    WebViewClient
    WebChromeClient
  • 打开和关闭硬件加速
  • View.setScrollBarStyle
    WebView.setVerticalScrollBarOverlay
    等中的各种设置
  • 调整
    的高度/宽度属性和样式
  • 各种视频格式,包括带有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(仅此而已):


我对这件事真是摸不着头脑,我很惊讶我竟然找不到任何关于这件事的提及。无论多么牵强,任何输入都值得赞赏。

问题似乎在于硬件/opengl层。由于VideoView使用硬件层来渲染视频,我相信同样的情况也会发生在带有视频的webView上

因此,如果您设置正确的层,它们不应该相互干扰,因此就像我在coments上所说的,您应该将ListView设置为layer none或software,以禁用硬件加速,并在webView或窗口上启用它


更多关于

硬件加速的信息我也有同样的问题,我必须使用相对布局。它将视频渲染到的层不会随webview移动。因此,它将渲染视频,就好像webview位于0,0

您可以通过实际将webview定位在0处,位于任何可能已经存在的组件后面来解决此问题。然后在css中给内容留一个空白,以便将其定位在正确的位置

它可能不干净,但我还没有找到其他解决办法


编辑:在仔细看了你的问题之后,我认为这与相对布局无关,因为你没有使用相对布局。尽管如此,这种变通方法还是对我有效。所以我猜无论你使用什么布局,“视频层”都会保持在0,0。顺便说一下,我只是在Galaxy Tab 2(android 4.0.3)上遇到了这个问题。

我在主/详细流程布局中也遇到了同样的问题。通过将图层类型设置为软件,我的视频被切成两半的问题就消失了。这将关闭webview的硬件加速

webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

仅供参考,我只在亚马逊平板电脑上遇到过这个问题

您是否考虑过使用VideoView覆盖而不是在webview中嵌入视频?如果webview上的视频类似于VideoView,它将位于曲面上,曲面只能是一个曲面,因此您是否尝试过关闭ListView硬件加速功能。@nininho:这听起来很有希望。我试过设置
view.setLayerType(view.LAYER\u TYPE\u软件,null)onCreateView
中,代码>,但没有更改。无论是否使用该调用,对
getLayerType
的调用都会在列表视图和web视图上产生
LAYER\u TYPE\u NONE
。是否有其他方法请求软件层?在应用程序级别关闭加速可以修复布局问题,但当然会导致视频无法显示。@Phil是的,事实上效果很好。我有一个人工需求,需要使用一些现有的web代码。我可能会抛出一些javascript来拦截html视频播放器上的状态更改,隐藏它,然后调用Android代码来启动视频视图,但这对我来说就像我正在做的布局舞蹈一样,既粗糙又脆弱。如果我可以删除或重写网页代码,那么你的答案就是正确的。@f20k:不幸的是,我从来没有想到过比css左边距黑客更好的方法。
<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>
    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;
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);