ActionBar从YouTube Player API覆盖YouTubePlayerSupportFragment

时间:2015-11-30 12:21:15

标签: android-youtube-api

我使用扩展AppCompatActivity的主题扩展了Theme.AppCompat.Light.DarkActionBar的活动。 此活动的视图是LinearLayout,其VERTICAL方向包含以下视图:

  1. 包含FrameLayout的{​​{1}}。请注意,我在初始化成功时在获得的YouTubePlayerSupportFragment上调用了以下方法:

    YouTubePlayer

    我还在播放器视图上设置setPlayerStyle(PlayerStyle.CHROMELESS) addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_CUSTOM_LAYOUT) ,应该隐藏并按需显示onClickListener

  2. 包含视频详细信息和内容的另一个视图

  3. 一些底视图
  4. 请注意,活动会调用ActionBarsupportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY)的填充量为LinearLayout

    android.support.v7.appcompat.R.attr.actionBarSize中,活动设置了AndroidManifest.xml

    在活动的android:configChanges="orientation|screenSize"方法中,我正在检查屏幕方向。如果它是风景,我“全屏”,如果它是肖像,我将回到正常的布局。

    通过“全屏”,我的意思是:

    1. 设置视图n°2并查看n°3 onConfigurationChangedvisibility
    2. 将活动的View.GONE背景颜色设置为某种透明色,如supportActionBar
    3. 0x55000000设为getWindow().getDecorView().systemUiVisibility
    4. 更改视图n°1 View.SYSTEM_UI_FLAG_FULLSCREEN,同时将LayoutParamswidth设置为height
    5. MATCH_PARENT
    6. 上拨打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,所以我不明白这个错误是怎么回事!

1 个答案:

答案 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,所以这里提供的任何代码都可能有小错字。如果您发现任何错误,请告诉我。

加分:我如何处理全屏。

要处理全屏模式,我只需在FrameLayoutDialog中设置除播放器和匹配视图(我GONE)之外的所有内容的可见性,确保LayoutParams'这两个视图的宽度和高度设置为MATCH_PARENT。要退出全屏,只需将您更改的所有视图的可见性设置回VISIBLE