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



我有一个YouTube API片段是静态添加在我的xml清单文件,即片段,有一个YouTube播放器里面。

我的项目中没有扩展fragment的文件。

在我的活动类中,我把这行代码放在我的活动类的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()的文档。要使其正常工作,您需要注意一些细微的差别:http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

每当方向发生变化时,只要包含所有子组件,活动就会被重新创建。现在重要的部分是,YouTubePlayer。Provider将保存它的阶段(例如:加载的视频,当前播放位置和播放器配置)。请看下面的内容:

YouTubePlayer概述

在你的例子中,在方向改变后,只要它的子片段(youTubePlayerFragment),活动就会被重新创建。所以你失去了YouTubePlayer的即时引用和数据(如videoID或video url),这是加载视频所必需的,但是YouTubePlayer的提供程序仍然保持以前的状态,在旋转后变为空。

解决方案:你实际上需要管理一种方法来保存在设备改变方向之前在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");
}

在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 !!!");
        }
    });
}

最新更新