2013-04-08 13 views
5

Ich habe ein YouTube-API-Fragment, das in meiner XML-Manifest-Datei statisch hinzugefügt wird, das heißt ein Fragment, das einen YouTube-Player in der es hat.Wie wird das Fragmentfragment beibehalten, das nach der Änderung der Ausrichtung das Video wiedergibt?

Ich habe nicht eine Datei, das Fragment in meinem Projekt erstreckt.

In meiner Tätigkeit Klasse habe ich diese Zeile Code in der onCreate meiner Tätigkeit Klasse:

youTubePlayerFragment.setRetainInstance(true); 

Es nicht beeinträchtigt hat: wenn ich den Bildschirm drehen bekomme ich einen schwarzen Bildschirm des Fragments .

Wie kann ich es das Fragment nach der Orientierungsänderung weiterhin erhalten zu spielen?

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

Antwort

3

Die schnelle und einfache Lösung ist folgendes zu Ihrem Video-Aktivität in Ihrem Manifest hinzuzufügen:

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

Ich habe eine Anwendung, die diese für ein Video verwendet und es funktioniert gut. Bei einer Orientierungsänderung wird alles korrekt ausgeführt, und die Aktivität und die Fragmentinstanz werden nicht abgerissen und können nahtlos weitergespielt werden.

Wenn Sie möchten, dass die Aktivität abgebrochen/neu erstellt wird, während Sie die Fragment-Instanz beibehalten, lesen Sie erneut die Dokumentation für setRetainInstance(). Es gibt einige feine Nuancen, die Sie beachten müssen, damit dies richtig funktioniert: http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

2

Jedes Mal, wenn sich die Ausrichtung ändert, wird die Aktivität so lange neu erstellt wie bei allen untergeordneten Komponenten. Jetzt ist der wichtigste Teil ist, dass, YouTubePlayer.Provider seine Bühnen halten (wie zB: geladene Videos, die aktuelle Abspielposition und Spieler-Konfigurationen). Werfen Sie einen Blick auf die folgenden:

YouTubePlayer Overview

In Ihrem Fall, nachdem die Ausrichtung ändert, wird die Aktivität, solange ihr Kind Fragment (youTubePlayerFragment) neu erstellt. So verloren die Referenz der Youtubeplayer Instant und die Daten (wie videoID oder Video-URL), die notwendig sind, um das Video zu laden, aber die Youtubeplayer des Anbieters noch den vorherigen Zustand gehalten wird, die nach der Drehung null werden.

Lösung: Sie müssen tatsächlich eine Möglichkeit zum Speichern der Daten für das Abspielen des Videos auf YouTubePlayer verwalten, bevor das Gerät die Ausrichtung ändern und die Daten abrufen, wenn die Aktivität neu erstellt wird. Werfen Sie einen Blick auf die folgenden:

YouTubePlayerFragment Overview

Nicht sicher über Ihre Code-Struktur, aber hoffen, dass der folgende Code wird Ihnen eine Vorstellung:

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

Eine Probe um das Video zu bekommen spielen auf 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 !!!"); 
     } 
    }); 
} 
Verwandte Themen