【问题标题】:ActionBar overlaying YouTubePlayerSupportFragment from YouTube Player API从 YouTube Player API 覆盖 YouTubePlayerSupportFragment 的 ActionBar
【发布时间】:2016-03-04 02:05:05
【问题描述】:

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

  1. 包含YouTubePlayerSupportFragmentFrameLayout。请注意,我在初始化成功时对获得的YouTubePlayer 调用了以下方法:

    setPlayerStyle(PlayerStyle.CHROMELESS)
    addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_CUSTOM_LAYOUT)
    

    我还在播放器视图上设置了一个onClickListener,应该根据需要隐藏和显示ActionBar

  2. 另一个包含视频细节和内容的视图

  3. 一些底视图

请注意,活动调用supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY),并且LinearLayout 的顶部填充为android.support.v7.appcompat.R.attr.actionBarSize

AndroidManifest.xml 中,活动设置了android:configChanges="orientation|screenSize"

在活动的onConfigurationChanged 方法中,我正在检查屏幕方向。如果是横向,我会“全屏”,如果是纵向,我会回到正常布局。

“全屏”是指:

  1. 将视图 n°2 和视图 n°3 visibility 设置为 View.GONE
  2. 将活动的supportActionBar背景颜色设置为一些透明颜色,如0x55000000
  3. getWindow().getDecorView().systemUiVisibility 设置为View.SYSTEM_UI_FLAG_FULLSCREEN
  4. 更改视图 n°1 LayoutParams,将 widthheight 都设置为 MATCH_PARENT
  5. YouTubePlayer 上拨打setFullscreen(true)

现在,当我在我的应用程序中时,一切都以纵向模式运行:视频播放,播放器正确放置在 ActionBar 下方。当进入横向模式时,它会继续按预期工作:除了播放器(甚至是ActionBar)之外,一切都消失了。然后我点击现在全屏的 YouTube 播放器。

预期的结果是ActionBar 出现,而​​不会中断播放。

实际结果是系统状态栏和ActionBar都出现了,播放中断,报如下错误:

由于播放器顶部出现未经授权的叠加,YouTube 视频播放停止。 YouTubePlayerView 被 android.support.v7.widget.ActionBarContainer{43744840 V.ED.... ........ 0,50-1280,162 #7f0d005b app:id/action_bar_container} 遮挡。视图位于 YouTubePlayerView 内部,遮挡视图的每个边缘与 YouTubePlayerView 之间的距离(以 px 为单位)为:左:0,上:50,右:0,下:558..

YouTubePlayer 应该让 ActionBar 覆盖它,如 Sample Applications 中的 Overlay ActionBar Demo 所示。那么这里有什么问题呢?我以为它只是检查覆盖它的视图是否是 ActionBar,所以我不明白这个确切的错误是怎么可能的!

【问题讨论】:

    标签: android-youtube-api


    【解决方案1】:

    好的,由于确实不支持 Android YouTube Player API,我将回答您实际上必须如何做才能使其正常工作。

    首先,放弃使用 ActionBar 的想法。这是一个旧 API,其中包含控件很难看,处理起来很痛苦,而且如果您不使用 Google 提供的示例,它甚至不起作用。此答案的其余部分将解释如何在 YouTube 播放器上添加控件的工作方法,但如果您真的想使用 ActionBar,您将不会在此处找到答案(也不会在其他任何地方据我所知)。

    很好。现在,为了让它工作,您可以正常使用 YouTube 播放器。我建议使用 Fragment,因为必须扩展现有的 Activity 类可能是个问题。在OnInitializationSuccess 回调中使用player.setPlayerStyle(PlayerStyle.CHROMELESS) 删除播放器的所有控件。

    现在,要让您的控件在播放器之上而不暂停,您需要使用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 = 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(Fragment) 中的某个位置。

    我不确定我在此处列出的所有内容是否都是强制执行的,但我就是这样做的并且它有效。

    注意:正如我所说,我正在使用 Kotlin 和 Anko,我已经有几个月没有编写 Java 了,所以这里提供的任何代码都可能有小错别字。如果您发现任何错误,请告诉我。

    奖励:我是如何处理全屏的。

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

    【讨论】:

    • 所以我想显示播放/暂停和搜索栏等控件按钮,这些控件可以覆盖在播放器上,或者它只是在某个地方相对于播放器可能是上/下/左/右?我可以用你的解决方案做到这一点吗?
    • @AkhilDad 使用此方法,您几乎可以在播放器之上拥有任何您想要的东西。
    猜你喜欢
    • 1970-01-01
    • 2013-01-03
    • 2017-11-15
    • 2016-06-21
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2022-10-04
    相关资源
    最近更新 更多