2013-04-08 3 views
5

У меня есть фрагмент API YouTube, который статически добавляется в файл манифеста 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" /> 

ответ

3

Быстрое и простое решение, чтобы добавить следующее к видео активности, в манифесте:

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 и данные (такие как видеоID или видеоролик), которые необходимы для загрузки видео, но поставщик 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 !!!"); 
     } 
    }); 
} 
Смежные вопросы