方向更改时 YouTubePlayerFragment 黑屏

YouTubePlayerFragment black screen on orientation changes

我正在努力 YouTubePlayerFragment 在方向改变时继续玩。

代码如下所示:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
    FrameLayout frameLayout = new FrameLayout(getActivity());
    populateViewForOrientation(inflater, frameLayout);
    return frameLayout;
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    LayoutInflater inflater = LayoutInflater.from(getActivity());
    populateViewForOrientation(inflater, (ViewGroup) getView());
}

private void populateViewForOrientation(LayoutInflater inflater, ViewGroup viewGroup) {
    viewGroup.removeAllViewsInLayout();
    rootView = inflater.inflate(getLayoutResId(), viewGroup);
    ButterKnife.bind(this, rootView);

    if (frYTube != null) {
       FragmentTransaction transaction = getFragmentManager().beginTransaction();
       transaction.replace(R.id.frame, frYTube);
       transaction.commitAllowingStateLoss();
    }
}

片段已替换(我看到上面有文字)并且正在播放音乐但没有播放视频 - 黑屏。 我该如何处理?有可能取回视频吗?顺便说一句,如果旋转后下一个视频是 oppenes - 视频出现。 我试过为当前视频调用 pauseplay - 它没有帮助。 我没有尝试 YouTubePlayerView 因为我使用 moxy 所以我需要处理片段。

upd

看起来创建带有 YouTubePlayerFragment 的自定义视图具有更稳定的行为(然后删除添加视图)。但是黑屏问题依然存在

在这种情况下可以通过以下方式恢复视频:

 mYouTubePlayer.loadVideo(url);
 ...
 public void onLoaded(String s) {
  mYouTubePlayer.seekToMillis(mills);

但是重新加载视频没有任何意义,我正在努力避免这种情况 - 出现延迟

基于此 post, make sure that you are initializing the YouTubePlayerView in onCreate() when onCreate() was called during a restore rather than an explicit create. Here's a tutorial 其中包含片段的 activity 不需要扩展任何特殊基础 class.

您也可以查看此相关主题:Screen orientation not working with youtubePlayerfragment

快速简便的解决方案是将以下内容添加到您的视频 activity,在您的清单中:

android:configChanges="orientation|keyboard|keyboardHidden|screenSize"

我有一个应用程序将它用于视频,并且运行良好。一切都在方向变化时正确布局,activity 和片段实例不会被拆除,允许它无缝地继续播放。

如果希望activity被撕裂down/recreated,同时保留片段实例,请重新阅读setRetainInstance()的文档。

您需要注意一些细微差别才能使其正常工作: https://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

使用它会在方向改变后继续播放片段

我发现并有效的唯一方法是手动处理屏幕方向:

1) 添加到您的 activity:

android:configChanges="keyboard|keyboardHidden|orientation|screenSize"

2) 在 activity class:

@Override
public void onConfigurationChanged(Configuration newConfig) {
   super.onConfigurationChanged(newConfig);
   someFunctionToHandleOrienttion();
}

并且您不应该扩充新布局。只需删除 recreate/add 除了 youtubeframe 之外的所有内容,即可使土地布局看起来像您想要的。这有点棘手和奇怪,但在其他情况下,您会看到黑屏而不是视频。