Android `VideoView.start()`导致其他视图中断

Android `VideoView.start()`导致其他视图中断,android,android-layout,android-ui,Android,Android Layout,Android Ui,当我的活动通过onNewIntent接收到新的意图时,它会更新三个视图的数据,一个图像视图,一个文本视图,以及一个视频视图。问题是,另外两个视图只是闪烁,然后在myVideoView启动时消失。在分散几个断点之后,我发现它们在设置内容时出现,但在我的MediaPlayer.onPrepared()方法中调用VideoView.onStart()时消失。按下菜单按钮时,我还会显示一个警报对话框。按下菜单按钮后,它显示出来。我使用的是Android API 9,因为这是我正在使用的设备上的API。我

当我的活动通过
onNewIntent
接收到新的意图时,它会更新三个
视图
的数据,一个
图像视图
,一个
文本视图
,以及一个
视频视图
。问题是,另外两个视图只是闪烁,然后在my
VideoView
启动时消失。在分散几个断点之后,我发现它们在设置内容时出现,但在我的
MediaPlayer.onPrepared()
方法中调用
VideoView.onStart()
时消失。按下菜单按钮时,我还会显示一个
警报对话框
。按下菜单按钮后,它显示出来。我使用的是Android API 9,因为这是我正在使用的设备上的API。我真的需要帮助,所以如果有任何建议,我将不胜感激

这是布局图。但我认为这不是问题所在:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:keepScreenOn="true" >

    <TextView
        android:id="@+id/marquee"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:ellipsize="marquee"
        android:focusable="false"
        android:marqueeRepeatLimit="marquee_forever"
        android:scrollHorizontally="true"
        android:singleLine="true"
        android:textAppearance="@android:style/TextAppearance.Large"
        android:textColor="@android:color/white" >
    </TextView>

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_above="@id/marquee"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_gravity="center_vertical" />

    <VideoView
        android:id="@+id/video"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/marquee"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_alignWithParentIfMissing="true"
        android:layout_toLeftOf="@+id/image" />

</RelativeLayout>

注意
TextView
是一个选框;它应该保持横向滚动,直到被处理掉。我发现,当文本太短而无法启动字幕时,TextView和ImageView会消失(如前所述,它们会在一瞬间出现,然后消失)但是,当文本激活选框功能时,一切正常。

当前:


在调用
VideoView.start()
之后,我通过在我的
ImageView
TextView
上调用
postInvalidateDelayed(500)
使它工作起来。我认为是
start()
方法造成了问题,并要求其他视图调用
invalidate()
。此外,出于某种原因,在调用
start()
和调用
invalidate()

之间需要有一个小的延迟布局是问题所在

您的视频视图被声明为
match\u parent,match\u parent
,允许它使用屏幕的整个宽度和高度。由于您最后在xml文件中声明了它(您使用了RelativeLayout.Ordering matters),所以TextView和ImageView将包含在VideoView中

如果你感到困惑,
match\u parent
fill\u parent
基本相同。这只是安卓2.3中的
fill\u parent
的另一个名称+

现在你能做些什么

对视图进行重新排序,以便首先声明最大的视图。在本例中,依次为VideoView、ImageView和TextView


还要注意,您的ImageView的高度设置为
填充\u parent
-您可能不希望这样做。

我创建了一个方法,但它看起来非常糟糕:

private void startVideo() {
    this.videoView.start();
    if (this.imageView != null)
        this.imageView.postInvalidateDelay(500);
    if (this.textView != null)
        this.textView.postInvalidateDelay(500);
}

它能用,但会让我觉得脏。

对不起,没用。另外,既然
图像视图
视频视图
都依赖于它们,那么
文本视图
不一定要排在第一位吗?