【问题标题】:How to retain instance of fragment of fragment playing video after change in orientation?方向改变后如何保留片段播放视频的片段实例?
【发布时间】:2013-03-30 01:26:03
【问题描述】:

我有一个静态添加到我的 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 orientation fragment android-youtube-api


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      YouTubePlayer Overview

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-23
        • 1970-01-01
        • 1970-01-01
        • 2015-11-20
        相关资源
        最近更新 更多