我有一个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" />
答案 0 :(得分:4)
快速简便的解决方案是在您的视频活动中添加以下内容:
android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
我有一个应用程序将其用于视频,它运行得很好。一切都在方向改变时正确布局,活动和片段实例不会被拆除,从而无缝继续播放。
如果您希望拆除/重新创建活动,同时保留片段实例,请重新阅读setRetainInstance()
的文档。为了使其正常工作,您需要注意一些微妙的细微差别:http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)
答案 1 :(得分:2)
每次更改方向时,只要包含所有子组件,就会重新创建活动。现在重要的是, YouTubePlayer.Provider 将保持其阶段(例如:加载的视频,当前播放位置和播放器配置)。看看以下内容:
在您的情况下,在方向更改后,只要其子片段(youTubePlayerFragment)重新创建活动。因此,您丢失了YouTubePlayer即时消息的引用以及加载视频所需的数据(例如videoID或视频网址),但YouTubePlayer的提供商仍然保持之前的状态,该状态在轮换后变为空。
解决方案:您实际上需要设置一种方法来保存在设备更改方向之前在YouTubePlayer上播放视频所需的数据,并在重新创建活动时检索数据。看看以下内容:
YouTubePlayerFragment Overview
不确定您的代码结构,但希望以下代码能给您一些想法:
@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 !!!");
}
});
}