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
接收到新的意图时,它会更新三个视图
的数据,一个图像视图
,一个文本视图
,以及一个视频视图
。问题是,另外两个视图只是闪烁,然后在myVideoView
启动时消失。在分散几个断点之后,我发现它们在设置内容时出现,但在我的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);
}
它能用,但会让我觉得脏。对不起,没用。另外,既然
图像视图
和视频视图
都依赖于它们,那么文本视图
不一定要排在第一位吗?