5

我有一个静态添加到我的 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" />
4

2 回答 2

4

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

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

我有一个将它用于视频的应用程序,它工作得很好。一切都在方向变化时正确布局,并且活动和片段实例不会被拆除,使其能够无缝地继续播放。

如果您希望拆除/重新创建活动,同时保留片段实例,请重新阅读setRetainInstance(). 您需要注意一些细微差别才能使其正常工作:http: //developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

于 2013-12-30T16:49:46.903 回答
2

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

YouTube 播放器概述

在您的情况下,方向更改后,只要其子片段(youTubePlayerFragment),就会重新创建活动。因此,您丢失了 YouTubePlayer 的即时引用和加载视频所需的数据(例如 videoID 或视频 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 !!!");
        }
    });
}
于 2013-12-31T12:22:56.613 回答