Android 隐藏在YouTube播放器全屏系统UI下的工具栏覆盖
我在我的活动中使用了一个,并试图在玩家全屏时用一个应用程序栏(又名动作栏)覆盖该玩家。我遵循YouTube播放器API“Overlay ActionBar Demo”和YouTubePlayerFragment文档中的指导原则和示例(更多详细信息见下文) 当我从内核扩展并使用内核时,所有这些都工作得很好。但当我切换到使用支持时,会出现一些问题:Android 隐藏在YouTube播放器全屏系统UI下的工具栏覆盖,android,android-layout,youtube-api,android-youtube-api,Android,Android Layout,Youtube Api,Android Youtube Api,我在我的活动中使用了一个,并试图在玩家全屏时用一个应用程序栏(又名动作栏)覆盖该玩家。我遵循YouTube播放器API“Overlay ActionBar Demo”和YouTubePlayerFragment文档中的指导原则和示例(更多详细信息见下文) 当我从内核扩展并使用内核时,所有这些都工作得很好。但当我切换到使用支持时,会出现一些问题: 工具栏位于状态栏和导航栏下 当工具栏位于播放机顶部时,播放机不再播放 就定位和覆盖而言,播放器全屏模式似乎用于将操作栏(以及状态栏和导航栏)视为系统
- 工具栏位于状态栏和导航栏下
- 当工具栏位于播放机顶部时,播放机不再播放
ActionBarDemoActivity
)中重现此行为,并进行了以下更改:
- 扩展
AppCompatActivity
- 将导入从
更改为android.app.ActionBar
android.support.v7.app.ActionBar
- 将工具栏添加到布局
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <view class="com.examples.youtubeapidemo.ActionBarDemoActivity$ActionBarPaddedFrameLayout" android:id="@+id/view_container" android:layout_width="match_parent" android:layout_height="match_parent"> ... <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_height="wrap_content" android:layout_width="match_parent" android:minHeight="?attr/actionBarSize" android:background="@color/material_deep_teal_500" /> </FrameLayout>
- 将工具栏设置为
onCreate()中的操作栏
- 实施
- 扩展布局并在非全屏时设置填充,以便内容显示在工具栏下方
@Override public void onFullscreen(boolean fullscreen) { viewContainer.setEnablePadding(!fullscreen); ... } public static final class ActionBarPaddedFrameLayout extends FrameLayout { public void setEnablePadding(boolean enable) { paddingEnabled = enable; requestLayout(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int topPadding = paddingEnabled && actionBar != null && actionBar.isShowing() ? actionBar.getHeight() : 0; setPadding(0, topPadding, 0, 0); super.onMeasure(widthMeasureSpec, heightMeasureSpec); }
- 设置YouTube播放器全屏控制标志
player.addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_CUSTOM_LAYOUT);
- 处理配置更改
<activity ... android:configChanges="keyboardHidden|orientation|screenSize" ... </activity>
添加到XML文件中的工具栏。我怀疑这是一个bug。我针对布局问题提交了一份新的bug报告,并在现有报告中添加了一条评论,指出SupportActionBar/工具栏被视为非法覆盖尝试将android:fitsSystemWindows=“true”
。这修复了全屏显示中的布局,但导致在离开全屏时在工具栏中添加了填充()。我在android:fitsystemwindows=“true”
方法中添加了逻辑,以删除工具栏填充(onFullscreen(boolean)
),但不幸的是,这仍然显示了空白代替填充,在下次重新绘制布局时(例如,单击项目、启动播放器等)空白消失。对于如何正确设置布局/填充,我仍然有点困惑,但目前的解决方法可以解决这个问题 非法覆盖问题 鉴于显示工具栏将全屏暂停YouTube播放器,我添加了逻辑,仅在播放器已暂停时显示工具栏。这并不理想,因为它会强制用户暂停播放器以查看工具栏,但这是我能想到的最好的选择 在全屏(布尔值)中,如果进入全屏且播放器正在播放,工具栏将隐藏Toolbar.setPadding(0,0,0,0)
在设置播放机时(在public void onFullscreen(boolean isFullscreen) { mFullscreen = isFullscreen; if (isFullscreen && youTubePlayer.isPlaying()) { toolbar.setVisibility(View.GONE); } else { toolbar.setVisibility(View.VISIBLE); } }
中),我添加了一个侦听器来显示和隐藏“播放和暂停”工具栏:onInitializationSuccess()
youTubePlayer.setPlaybackEventListener(new YouTubePlayer.PlaybackEventListener() { ... @Override public void onPlaying() { if (mFullscreen) { toolbar.setVisibility(View.GONE); } } @Override public void onPaused() { if (mFullscreen) { toolbar.setVisibility(View.VISIBLE); } } });
此代码将解决您的问题。 隐藏导航栏和工具栏的步骤public void fullScreenCall() { if(Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { //lower api View v = getActivity().getWindow().getDecorView(); v.setSystemUiVisibility(View.GONE); } else if(Build.VERSION.SDK_INT >= 19) { //for new api versions. View decorView = getActivity().getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); } }
返回正常模式public void fullScreenCall(){ 如果(Build.VERSION.SDK_INT>11&&Build.VERSION.SDK_INT<19){//lower api 视图v=getActivity().getWindow().getDecorView(); v、 设置系统兼容性(View.GONE); }else if(Build.VERSION.SDK_INT>=19){ //对于新的api版本。 View decorView=getActivity().getWindow().getDecorView(); int uiOptions=View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY|View.SYSTEM_UI_FLAG_全屏显示; decorView.设置系统兼容性(uiOptions); } }
public void normalScreenCall() { if(Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api View v = getActivity().getWindow().getDecorView(); v.setSystemUiVisibility(View.VISIBLE); } else if(Build.VERSION.SDK_INT >= 19) { //for new api versions. View decorView = getActivity().getWindow().getDecorView(); decorView.setSystemUiVisibility(0); } }
谢谢。这似乎解决了第一个问题(工具栏隐藏在系统UI下),但没有解决第二个问题(当工具栏位于顶部时,播放器仍会停止)。我过早地点击了send,意在添加以下内容:退出全屏模式时,它还引入了一些奇怪的行为。将public void normalScreenCall(){ 如果(Build.VERSION.SDK_INT>11&&Build.VERSION.SDK_INT<19){//lower api 视图v=getActivity().getWindow().getDecorView(); v、 设置系统兼容性(视图可见); }else if(Build.VERSION.SDK_INT>=19){ //对于新的api版本。 View decorView=getActivity().getWindow().getDecorView(); decorView.设置系统不可分割性(0); } }
添加到工具栏XML时,退出全屏会在工具栏顶部添加填充()。在样式中添加android:fitsystemwindows=“true”
时,它会在工具栏的顶部和右侧添加空白()。true
public void fullScreenCall() { if(Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { //lower api View v = getActivity().getWindow().getDecorView(); v.setSystemUiVisibility(View.GONE); } else if(Build.VERSION.SDK_INT >= 19) { //for new api versions. View decorView = getActivity().getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); } }
public void normalScreenCall() { if(Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api View v = getActivity().getWindow().getDecorView(); v.setSystemUiVisibility(View.VISIBLE); } else if(Build.VERSION.SDK_INT >= 19) { //for new api versions. View decorView = getActivity().getWindow().getDecorView(); decorView.setSystemUiVisibility(0); } }