我使用扩展AppCompatActivity
的主题扩展了Theme.AppCompat.Light.DarkActionBar
的活动。
此活动的视图是LinearLayout
,其VERTICAL
方向包含以下视图:
包含FrameLayout
的{{1}}。请注意,我在初始化成功时在获得的YouTubePlayerSupportFragment
上调用了以下方法:
YouTubePlayer
我还在播放器视图上设置setPlayerStyle(PlayerStyle.CHROMELESS)
addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_CUSTOM_LAYOUT)
,应该隐藏并按需显示onClickListener
。
包含视频详细信息和内容的另一个视图
请注意,活动会调用ActionBar
,supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY)
的填充量为LinearLayout
。
在android.support.v7.appcompat.R.attr.actionBarSize
中,活动设置了AndroidManifest.xml
。
在活动的android:configChanges="orientation|screenSize"
方法中,我正在检查屏幕方向。如果它是风景,我“全屏”,如果它是肖像,我将回到正常的布局。
通过“全屏”,我的意思是:
onConfigurationChanged
至visibility
View.GONE
背景颜色设置为某种透明色,如supportActionBar
0x55000000
设为getWindow().getDecorView().systemUiVisibility
View.SYSTEM_UI_FLAG_FULLSCREEN
,同时将LayoutParams
和width
设置为height
MATCH_PARENT
setFullscreen(true)
醇>
现在,当我在我的应用程序中时,一切都以纵向模式运行:视频播放,播放器正确放置在YouTubePlayer
正下方。当进入横向模式时,它会按预期继续工作:除了玩家(甚至是ActionBar
)之外,一切都会消失。然后我点击现在的全屏YouTube播放器。
预期结果是ActionBar
显示,而不会中断播放。
实际结果是系统状态栏和ActionBar都显示,并且播放因以下错误而中断:
YouTube视频播放因播放器顶部未经授权的覆盖而停止。 YouTubePlayer视图被android.support.v7.widget.ActionBarContainer {43744840 V.ED .... ........ 0,50-1280,162#7f0d005b app:id / action_bar_container}遮挡。该视图位于YouTubePlayerView内部,隐藏视图的每个边缘与YouTubePlayerView之间的距离为px:left:0,top:50,right:0,bottom:558 ..
YouTubePlayer应该让ActionBar覆盖它,如Overlay ActionBar Demo中的Sample Applications所示。那么这里的问题是什么?我认为只是检查视图是否包含ActionBar,所以我不明白这个错误是怎么回事!
答案 0 :(得分:5)
好的,因为实际上不支持Android YouTube播放器API,我会回答您实际操作的方式。
首先,放弃使用ActionBar的想法。这是一个旧的API,如果你没有使用Google提供的样本,那么控制它就很难看,它很难处理,而且甚至无法正常工作。本回答的其余部分将解释如何在YouTube播放器顶部添加控件的工作方法,但如果您真的想使用ActionBar,则无法在此处找到答案(也不是其他任何地方)据我所知)。
精细。现在,为此,您可以正常使用YouTube播放器。我建议使用Fragment,因为必须扩展现有的Activity类可能是个问题。使用player.setPlayerStyle(PlayerStyle.CHROMELESS)
回调中的OnInitializationSuccess
删除播放器的所有控件。
现在,要将控件置于播放器之上而不暂停播放,您需要使用DialogFragment
(单独使用Dialog
可能会有效,但此处使用片段再次提供更多控件你能做什么):
DialogFragment
onCreate(Bundle)
并致电setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Translucent_NoTitleBar)
onCreateView(LayoutInflater, ViewGroup, Bundle)
并在此处重新创建您的活动布局,无论您想要什么。我正在使用Kotlin和Anko,所以一切都是动态的,我没有XML。无论如何,重新创建您的布局但没有最终视图(结果应该完全不可见)。FrameLayout
,您可以添加控件,就好像它是播放器FrameLayout
覆盖onStart()
并在现在创建的Dialog
上调用以下方法,以确保您的Dialog是全屏且透明的:
Dialog dialog = getDialog();
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(false);
dialog.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// TODO Dismiss the Dialog AND call onBackPressed() on the underlying Activity
return true;
} else {
return false;
}
}
});
Window window = getWindow();
window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
WindowManager.LayoutParams layoutParams = window.getAttributes();
layoutParams.setDimAmount(0f);
layoutParams.setFlags(layoutParams.getFlags() | WindowManager.LayoutParams.FLAG_DIM_BEHIND);
window.setAttributes(layoutParams);
现在你必须处理你的控件,让它们在定时器后消失等等。 只需确保在Dialog(片段)中的某些位置放置将覆盖播放器的所有内容。
我不确定我在此列出的所有内容对于此工作是强制性的,但这就是我如何做到的并且有效。
注意:正如我所说,我正在与Kotlin和Anko合作,我几个月没有写Java,所以这里提供的任何代码都可能有小错字。如果您发现任何错误,请告诉我。
加分:我如何处理全屏。
要处理全屏模式,我只需在FrameLayout
到Dialog
中设置除播放器和匹配视图(我GONE
)之外的所有内容的可见性,确保LayoutParams
'这两个视图的宽度和高度设置为MATCH_PARENT
。要退出全屏,只需将您更改的所有视图的可见性设置回VISIBLE
。