android 中的导航抽屉和 VideoView
Navigation Drawer and VideoView in android
我正在使用导航抽屉和表格布局。我的选项卡中有一段视频,起初看不到,但我能听到声音。一旦我设置
video_view.setZOrderOnTop(true);
我也可以看到视频,但这会导致导航抽屉出现 问题。
当我滑动它时,视频不会像所有其他元素一样隐藏在导航抽屉后面。
如果我不使用
video_view.setZOrderOnTop(true);
那么我的抽屉工作正常。
main_activity.xml
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Framelayout to display Fragments -->
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/menuwhite2"
android:id="@+id/custom_home"
android:gravity="center"
android:layout_gravity="right"
android:layout_marginRight="10dp"/>
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="fixed"
app:tabGravity="fill"
/>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
<!-- Listview to display slider menu -->
<ListView
android:id="@+id/list_slidermenu"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="end"
android:choiceMode="singleChoice"
android:divider="@color/list_divider"
android:dividerHeight="1dp"
android:listSelector="@drawable/list_selector"
android:background="@color/list_background"/>
tab_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<android.support.v7.widget.CardView
android:id="@+id/cardview"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello"/>
</android.support.v7.widget.CardView>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:id="@+id/layoutTop"
android:layout_width="match_parent"
android:layout_height="match_parent">
<VideoView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/video_player_view"
android:layout_height="200dp"
android:layout_width="fill_parent"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/layoutBottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/layoutTop">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello"/>
</RelativeLayout>
<ImageView
android:id="@+id/overlapImage"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_above="@id/layoutBottom"
android:adjustViewBounds="true"
android:src="@mipmap/ic_launcher" />
</RelativeLayout>
</LinearLayout>
TabFragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
final View view = inflater.inflate(R.layout.tab_fragment, container, false);
VideoView video_player_view = (VideoView) view.findViewById(R.id.video_player_view);
video_player_view.setVideoURI("videourl");
video_player_view.setZOrderOnTop(true);
video_player_view.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
video_player_view.start();
}
});
return view;
}
所以任何人都可以为我提供替代方案。
当您 setZOrderOnTop(true) 时,它将位于其他布局之上。实际上它控制着surface view的surface是否放在它上面window [see more].
I have a video in my tab which was not visible at first but I can
hear sound.
根据您的评论,您在 VideoView
上放置了其他布局,因此您看不到 VideoView 但您能听到声音。
通过在 phone 中转动 Layout bound
:
Setting-> developer option -> show Layout bound
您可以在 Layouts
中看到发生了什么。我猜你看不到 VideoView
因为你 layout_height
中的那些 match_parents
仔细检查它们(例如:为它们中的每一个放 50dp
)你的问题将得到解决.
同时将根布局设为 match_parent
而不是 wrap_content
。它没有解决问题,但更好。
几条评论后,OP 想看一些代码。
好的,让我们尝试这样的事情:
private DrawerLayout drawer;
private ActionBarDrawerToggle toggle;
protected void onResume() {
drawer.addDrawerListener(toggle);
toggle.syncState();
}
protected void onPause() {
drawer.removeDrawerListener(toggle);
toggle.syncState();
}
protected void onCreate(Bundle saveInstanceState) {
toggle = new ActionBarDrawerToggle(this, drawer,
toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {
public void onDrawerClosed(View view) {
Log.d(TAG, "--> ActionBarDrawerToggle::onDrawerClosed
(view=" + view + ")");
syncActionBarArrowState();
//call videoView.setZOrderOnTop(true) so it's over everything
}
public void onDrawerOpened(View drawerView) {
Log.d(TAG, "--> ActionBarDrawerToggle::onDrawerOpened
(drawerView=" + drawerView + ")");
toggle.setDrawerIndicatorEnabled(true);
//call videoView.setZOrderOnTop(false) so it's NOT over the drawer
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, 0);
//call videoView.setZOrderOnTop(false)
//so it's not over the drawer being pulled out
}
};
}
您是否尝试使用 TextureView 而不是 VideoView?
ViedoView 是众所周知的容易出错的视图。
我写了 frame-video-view,它(除其他外)简化了 TextureView
作为视频播放器的使用。
@Atula 我建议你一个简单的解决方案....这是完美的
我附上工作正常的屏幕截图....
试试这个
Used this
video_player_view.setZOrderMediaOverlay(true);
Instead Of
video_view.setZOrderOnTop(true);
我正在使用导航抽屉和表格布局。我的选项卡中有一段视频,起初看不到,但我能听到声音。一旦我设置
video_view.setZOrderOnTop(true);
我也可以看到视频,但这会导致导航抽屉出现 问题。
当我滑动它时,视频不会像所有其他元素一样隐藏在导航抽屉后面。
如果我不使用
video_view.setZOrderOnTop(true);
那么我的抽屉工作正常。
main_activity.xml
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Framelayout to display Fragments -->
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/menuwhite2"
android:id="@+id/custom_home"
android:gravity="center"
android:layout_gravity="right"
android:layout_marginRight="10dp"/>
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="fixed"
app:tabGravity="fill"
/>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
<!-- Listview to display slider menu -->
<ListView
android:id="@+id/list_slidermenu"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="end"
android:choiceMode="singleChoice"
android:divider="@color/list_divider"
android:dividerHeight="1dp"
android:listSelector="@drawable/list_selector"
android:background="@color/list_background"/>
tab_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<android.support.v7.widget.CardView
android:id="@+id/cardview"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello"/>
</android.support.v7.widget.CardView>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:id="@+id/layoutTop"
android:layout_width="match_parent"
android:layout_height="match_parent">
<VideoView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/video_player_view"
android:layout_height="200dp"
android:layout_width="fill_parent"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/layoutBottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/layoutTop">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello"/>
</RelativeLayout>
<ImageView
android:id="@+id/overlapImage"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_above="@id/layoutBottom"
android:adjustViewBounds="true"
android:src="@mipmap/ic_launcher" />
</RelativeLayout>
</LinearLayout>
TabFragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
final View view = inflater.inflate(R.layout.tab_fragment, container, false);
VideoView video_player_view = (VideoView) view.findViewById(R.id.video_player_view);
video_player_view.setVideoURI("videourl");
video_player_view.setZOrderOnTop(true);
video_player_view.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
video_player_view.start();
}
});
return view;
}
所以任何人都可以为我提供替代方案。
当您 setZOrderOnTop(true) 时,它将位于其他布局之上。实际上它控制着surface view的surface是否放在它上面window [see more].
I have a video in my tab which was not visible at first but I can hear sound.
根据您的评论,您在 VideoView
上放置了其他布局,因此您看不到 VideoView 但您能听到声音。
通过在 phone 中转动 Layout bound
:
Setting-> developer option -> show Layout bound
您可以在 Layouts
中看到发生了什么。我猜你看不到 VideoView
因为你 layout_height
中的那些 match_parents
仔细检查它们(例如:为它们中的每一个放 50dp
)你的问题将得到解决.
同时将根布局设为 match_parent
而不是 wrap_content
。它没有解决问题,但更好。
几条评论后,OP 想看一些代码。
好的,让我们尝试这样的事情:
private DrawerLayout drawer;
private ActionBarDrawerToggle toggle;
protected void onResume() {
drawer.addDrawerListener(toggle);
toggle.syncState();
}
protected void onPause() {
drawer.removeDrawerListener(toggle);
toggle.syncState();
}
protected void onCreate(Bundle saveInstanceState) {
toggle = new ActionBarDrawerToggle(this, drawer,
toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {
public void onDrawerClosed(View view) {
Log.d(TAG, "--> ActionBarDrawerToggle::onDrawerClosed
(view=" + view + ")");
syncActionBarArrowState();
//call videoView.setZOrderOnTop(true) so it's over everything
}
public void onDrawerOpened(View drawerView) {
Log.d(TAG, "--> ActionBarDrawerToggle::onDrawerOpened
(drawerView=" + drawerView + ")");
toggle.setDrawerIndicatorEnabled(true);
//call videoView.setZOrderOnTop(false) so it's NOT over the drawer
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, 0);
//call videoView.setZOrderOnTop(false)
//so it's not over the drawer being pulled out
}
};
}
您是否尝试使用 TextureView 而不是 VideoView?
ViedoView 是众所周知的容易出错的视图。
我写了 frame-video-view,它(除其他外)简化了 TextureView
作为视频播放器的使用。
@Atula 我建议你一个简单的解决方案....这是完美的
我附上工作正常的屏幕截图....
试试这个
Used this
video_player_view.setZOrderMediaOverlay(true);
Instead Of
video_view.setZOrderOnTop(true);