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

5
我有一个YouTube API碎片,在我的xml清单文件中静态添加,即一个带有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" />
2个回答

4
快速简单的解决方案是在您的视频活动中添加以下内容,放入您的清单文件中:
android:configChanges="orientation|keyboard|keyboardHidden|screenSize"

我有一个应用程序使用此功能来播放视频,一切都很好。在屏幕方向改变时,所有内容都可以正确布局,活动和片段实例也不会被摧毁,从而使其无缝地继续播放。
如果您想要重建/重新创建活动,同时保留片段实例,请重新阅读setRetainInstance()的文档。有一些微妙的细节需要注意,以使其正常工作: http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

2
每次方向改变时,活动将被重新创建,同时也会重新创建所有子组件。现在重要的是,YouTubePlayer.Provider将保持其阶段(如:已加载的视频、当前播放位置和播放器配置)。请看下面的内容: YouTubePlayer概述 在您的情况下,方向更改后,活动将被重新创建,只要它的子片段(youTubePlayerFragment)。因此,您失去了YouTubePlayer实例和必要的数据(如videoID或video url),这些数据是加载视频所必需的,但是YouTubePlayer的提供程序仍然保持先前的状态,在旋转后变为null。 解决方案:实际上,您需要管理一种保存播放YouTubePlayer所需数据的方式,以便在设备更改方向之前,并在活动重新创建时检索数据。请看下面的内容: YouTubePlayerFragment概述 不确定您的代码结构,但希望以下代码能给您一些想法:
 @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");
}

获取在YouTube播放视频的示例代码:
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 !!!");
        }
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接