2013-04-08 20 views
5

Mam fragment API YouTube, który został statycznie dodany do mojego pliku manifestu xml, tj. Fragmentu, w którym znajduje się odtwarzacz YouTube.Jak zachować instancję fragmentu fragmentu odtwarzającego wideo po zmianie orientacji?

Nie mam pliku, który rozszerza fragment w moim projekcie.

W mojej klasie aktywności mogę umieścić ten wiersz kodu w onCreate mojej klasie działalności:

youTubePlayerFragment.setRetainInstance(true); 

to nie ma żadnego wpływu: kiedy obrócić ekran dostaję pusty czarny ekran fragmentu .

Jak mogę go uruchomić, aby kontynuować odtwarzanie fragmentu po zmianie orientacji?

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

Odpowiedz

3

Szybkie i łatwe rozwiązaniem jest dodanie następujących do aktywności wideo, w swoim manifeście:

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

mam aplikację, która wykorzystuje to na filmie i to działa dobrze. Wszystko dzieje się poprawnie przy zmianie orientacji, a aktywność i fragment nie zostają zburzone, co umożliwia płynne kontynuowanie gry.

Jeśli chcesz, aby działanie zostało zburzone/odtworzone, zachowując instancję fragmentu, przeczytaj ponownie dokumentację dla setRetainInstance(). Istnieją pewne subtelne niuanse, które musisz znać, aby to działało poprawnie: http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

2

Za każdym razem, gdy zmienia się orientacja, aktywność będzie odtwarzana tak długo, jak z wszystkimi komponentami potomnymi. Ważną częścią jest to, że YouTubePlayer.Provider będzie przechodził etapy (takie jak: załadowane wideo, aktualna pozycja odtwarzania i konfiguracje odtwarzacza). Spojrzeć na następujące:

YouTubePlayer Overview

w Twoim przypadku, po zmianach orientacji aktywność jest odtworzona tak długo, jak jego fragment dziecięcej (youTubePlayerFragment). Straciłeś więc referencję chwili w YouTubePlayer i danych (takich jak videoID lub URL wideo), które są niezbędne do załadowania wideo, ale dostawca YouTubePlayer nadal utrzymuje poprzedni stan, który po rotacji staje się pusty.

Rozwiązanie: musisz zarządzać sposobem zapisywania danych potrzebnych do odtworzenia wideo na odtwarzaczu YouTube, zanim urządzenie zmieni orientację i odzyska dane po odtworzeniu działania. Spojrzeć na następujące:

YouTubePlayerFragment Overview

nie wiesz o swojej struktury kodu, ale nadzieję, że poniższy kod daje pewne wyobrażenie:

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

Próbkę aby uzyskać wideo gra na 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 !!!"); 
     } 
    }); 
}