Android 如何在方向改变后保留播放视频片段的片段实例?

Android 如何在方向改变后保留播放视频片段的片段实例?,android,orientation,fragment,android-youtube-api,Android,Orientation,Fragment,Android Youtube Api,我在xml清单文件中静态添加了一个YouTube API片段,即一个包含YouTube播放器的片段 我的项目中没有扩展片段的文件 在我的活动类中,我将这行代码放在活动类的onCreate中: youTubePlayerFragment.setRetainInstance(true); 它没有任何影响:当我旋转屏幕时,我得到一个碎片的空白黑屏 我如何让它在方向改变后继续播放片段 <fragment android:id="@+id/youtube_fragment"

我在xml清单文件中静态添加了一个YouTube API片段,即一个包含YouTube播放器的片段

我的项目中没有扩展片段的文件

在我的活动类中,我将这行代码放在活动类的
onCreate
中:

youTubePlayerFragment.setRetainInstance(true);
它没有任何影响:当我旋转屏幕时,我得到一个碎片的空白黑屏

我如何让它在方向改变后继续播放片段

<fragment
      android:id="@+id/youtube_fragment"
      android:name="com.google.android.youtube.player.YouTubePlayerFragment"
      android:layout_width="900dp"
      android:layout_height="500dp"
      android:layout_centerHorizontal="true"
      android:layout_centerVertical="true" />

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

android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
我有一个应用程序,用它来制作视频,效果很好。在方向改变时,所有内容都正确地进行了布局,活动和片段实例不会被拆下,从而可以无缝地继续播放


如果希望在保留片段实例的同时拆除/重新创建活动,请重新阅读
setRetainInstance()
的文档。要使其正常工作,您需要注意一些细微差别:

每次方向更改时,只要使用所有子组件,活动都将重新创建。现在重要的部分是,YouTubePlayer.Provider将保留其阶段(例如:加载的视频、当前播放位置和播放器配置)。请看以下内容:

在您的情况下,在方向更改后,只要活动的子片段(youTubePlayerFragment)存在,就会重新创建该活动。因此,您丢失了YouTubePlayer的即时和加载视频所需的数据(如videoID或视频url)的引用,但YouTubePlayer的提供程序仍保持以前的状态,在旋转后变为空

解决方案:您实际上需要管理一种方法,在设备更改方向之前保存在YouTubePlayer上播放视频所需的数据,并在重新创建活动时检索数据。请看以下内容:

不确定您的代码结构,但希望以下代码能给您一些想法:

 @Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("currentVideoID",videoID);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    videoID = savedInstanceState.getString("currentVideoID");
}
在youtubeplayer上播放视频的示例

private void loadYouTubePlayer(){
    //load your youTubePlayerFragment here, i used YouTubePlayerSupportFragment(),may change in your case
    //also you may not need to call getActivity(). Change the code as require
    youTubePlayerFragment = (YouTubePlayerSupportFragment)getActivity().getSupportFragmentManager().findFragmentById(R.id.youtube_fragment);
    youTubePlayerFragment.initialize(developerKey,new YouTubePlayer.OnInitializedListener() {
        @Override
        public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
            myYouTubePlayer = youTubePlayer;
            myYouTubePlayer.setFullscreenControlFlags(YouTubePlayer.FULLSCREEN_FLAG_CONTROL_ORIENTATION | YouTubePlayer.FULLSCREEN_FLAG_ALWAYS_FULLSCREEN_IN_LANDSCAPE);
            myYouTubePlayer.setOnFullscreenListener(new YouTubePlayer.OnFullscreenListener() {
                @Override
                public void onFullscreen(boolean b) {
                    isFullScreenPlaying = b;
                    Log.d(null,"Now fullScreen");
                }
            });
            if (!b) {
                myYouTubePlayer.loadVideo(videoID);
            }
        }

        @Override
        public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
        Log.e(null,"Initialization Failed !!!");
        }
    });
}