¿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.
- Android SensorManager.java getOrientation y algoritmo getRotationMatrix
- GetRotationMatrix y tutorial de getOrientation
- Cambiar la orientación de Bluestack: modo retrato / paisaje
- ¿Cómo puedo asegurar la correcta orientación de reproducción del video grabado?
- El diálogo no debe descartarse cuando cambia la orientación de la pantalla
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" />
- Captura de video de MediaRecorder en modo retrato
- Android: notifyDataSetChanged () no actualizar listview después de cambiar la orientación
- Android: varias preguntas de API de cámara
- Problema de orientación de Android
- FragmentActivity con ViewPager: Crash en el cambio de orientación
- Ciclo de vida de Android Fragment sobre cambios de orientación
- Servicio de Android> Actividad> Fragmento con ViewPager
- orientación de la cámara en android 2.3.6
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 !!!"); } }); }
- Animación de Android dejando artefactos
- Inhabilitación (atenuación y descoloración) de la animación del cuadro de diálogo