¿Cómo conservar la instancia de fragmento de fragmento de reproducción de vídeo después de un cambio de orientación?

Tengo un fragmento de API de YouTube que se agrega estáticamente en mi archivo de manifiesto xml, es decir, un fragmento que tiene un reproductor de youtube dentro de él.

No tengo un archivo que extienda el fragmento en mi proyecto.

En mi clase de actividad puse esta línea de código en el onCreate de mi clase de actividad:

 youTubePlayerFragment.setRetainInstance(true); 

No tiene ningún efecto: cuando giro la pantalla consigo una pantalla en blanco del fragmento en blanco.

¿Cómo puedo conseguir que continúe jugando el fragmento después del cambio de orientación?

 <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" /> 

La solución rápida y fácil es agregar lo siguiente a su actividad de video, en su manifiesto:

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

Tengo una aplicación que utiliza esto para un vídeo y funciona muy bien. Todo se establece correctamente en el cambio de orientación, y la actividad y la instancia de fragmentos no se desgarran lo que le permite seguir perfectamente a jugar.

Si desea que la actividad se desmonte / recree, conservando la instancia de fragmento, vuelva a leer la documentación de setRetainInstance() . Hay algunos matices sutiles que debe tener en cuenta para que esto funcione correctamente: http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

Cada vez que cambie la orientación, la actividad se recreará siempre y cuando todos los componentes secundarios. Ahora la parte importante es que, YouTubePlayer.Provider mantendrá sus etapas (tales como: videos cargados, la posición de reproducción actual y configuraciones de reproductor). Echa un vistazo a lo siguiente:

Descripción de YouTubePlayer

En su caso, después de los cambios de orientación, la actividad se vuelve a crear siempre y cuando su fragmento hijo (youTubePlayerFragment). Así que perdiste la referencia del instante de YouTubePlayer y los datos (como videoID o video url) que son necesarios para cargar el video, pero el proveedor de YouTubePlayer sigue manteniendo el estado anterior, que se convierte en nulo después de la rotación.

Solución: en realidad es necesario administrar una forma de guardar los datos necesarios para reproducir el vídeo en YouTubePlayer antes de que el dispositivo cambie la orientación y recuperar los datos cuando se recrea la actividad. Echa un vistazo a lo siguiente:

Descripción de YouTubePlayerFragment

No está seguro acerca de su estructura de código, pero espero que el siguiente código le dé una idea:

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

Una muestra para que el video se reproduzca en 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 !!!"); } }); } 
  • Combine giroscopio con acelerómetro para obtener el rumbo
  • ¿Cómo puedo proporcionar soporte de orientación para tablet solo en android?
  • ¿Cómo debo calcular el azimut, el tono, la orientación cuando mi dispositivo Android no es plano?
  • Obtener orientación de la imagen de MediaStore.Images.Media.DATA
  • Cambiar la orientación de la pantalla - Android 3.2 en VirtualBox
  • Orientación de la superficie de la cámara con el androide
  • Bloquear / desbloquear la orientación
  • ¿Diferencia entre sensor de orientación y sensor de campo magnético en Android?
  • El enfoque de EditText es inconsistente en todos los diseños
  • ConfigChanges = "orientation" no se activa en Galaxy Nexus
  • Android - Cómo acercarse al algoritmo de detección de caídas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.