5

xml マニフェスト ファイルに静的に追加された YouTube API フラグメントがあります。つまり、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" />
4

2 に答える 2

4

迅速かつ簡単な解決策は、マニフェストのビデオ アクティビティに次を追加することです。

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

これをビデオに使用するアプリがあり、問題なく動作します。方向の変更時にすべてが適切にレイアウトされ、アクティビティとフラグメント インスタンスが破棄されず、シームレスに再生を続けることができます。

フラグメント インスタンスを保持したまま、アクティビティを破棄/再作成する場合は、 のドキュメントを読み直してくださいsetRetainInstance()。これを適切に機能させるには、いくつかの微妙なニュアンスに注意する必要があります: http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

于 2013-12-30T16:49:46.903 に答える
2

向きが変わるたびに、すべての子コンポーネントがある限り、アクティビティが再作成されます。ここで重要な部分は、YouTubePlayer.Providerがステージ (ロードされたビデオ、現在の再生位置、プレーヤーの構成など) を保持することです。以下をご覧ください。

YouTubeプレーヤーの概要

あなたの場合、向きが変わった後、その子フラグメント(youTubePlayerFragment)である限り、アクティビティが再作成されます。そのため、YouTubePlayer のインスタントの参照と、ビデオをロードするために必要なデータ (videoID やビデオ URL など) を失いましたが、YouTubePlayer のプロバイダーはまだ前の状態を保持しており、ローテーション後に null になります。

解決策:実際には、デバイスが方向を変更する前に YouTubePlayer でビデオを再生するために必要なデータを保存し、アクティビティが再作成されたときにデータを取得する方法を管理する必要があります。以下をご覧ください。

YouTubePlayerFragment の概要

あなたのコード構造についてはよくわかりませんが、次のコードで何らかのアイデアが得られることを願っています:

 @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 !!!");
        }
    });
}
于 2013-12-31T12:22:56.613 に答える