[Android] YouTubePlayerフルスクリーン時の再読み込み回避方法
前回の「YouTube API V3を導入する第一歩」の内容を修正/加筆して行きます。
Manifest
内に記述。
<activity> android:configChanges="keyboardHidden|orientation|screenSize" </activity>
orientation を記述すれば大丈夫みたいですが、
screenSize も記述しないとエミュレーターを使用した際に
再読み込みしてしまう、らしいです。(未確認)
configChanges については、下記が詳しく載っています。
Y.A.M の雑記帳
http://y-anz-m.blogspot.jp/2010/03/android.html
XML
PlayerFragmentを設定していたら下記の様にPlayerView用に書き換えてください。
<com.google.android.youtube.player.YouTubePlayerView android:id="@+id/youtube" android:name="com.google.android.youtube.player.YouTubePlayerView" android:layout_width="match_parent" android:layout_height="wrap_content" />
Activity
public class MainActivity extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener, YouTubePlayer.OnFullscreenListener
今回は前回の様にYouTubePlayerFragmentではなく
YouTubePlayerViewを使用するのでYouTubeBaseActivityの継承が必須です。
何故FragmentからViewに変更したのかと言うと、
カスタマイズするにはこうしないといけないから、みたいです。
…こんな説明ですいません(汗)
恐らくYouTubePlayerFragmentとは、YouTubePlayerViewをカスタマイズして
フラグメント化したものなのではないでしょうか。(…未確認)
アクティビティ内のonCreateに追記。
@Override protected void onCreate(Bundle savedInstanceState) { // YouTubePlayerFragment から YouTubePlayerViewのインスタンスを取得に変更 youTubePlayer = (YouTubePlayerView) findViewById (R.id.youtube); }
アクティビティ内のonInitializationSuccessに追記。
@Override public void onInitializationSuccess(YouTubePlayer.Provider provider, final YouTubePlayer player, boolean wasRestored) { // Playerフルスクリーン時の挙動を手動制御に設定 player.addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_CUSTOM_LAYOUT); player.setOnFullscreenListener(this); }
そして、フルスクリーン時と通常時のレイアウトの定義が必要です。
フルスクリーンの状態(画面の向き)を変更すると、下記①〜③の順で呼ばれます。
① フルスクリーンの状態をbooleanで返す。
@Override public void onFullscreen(boolean isFullscreen) { // アプリケーションのウィンドウの中で有効なスペース全体をプレーヤーのビューが占有する必要がある。 fullscreen = isFullscreen; }
② 画面レイアウトの定義
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // 横向きにした場合にアクティビティが再構成されないようにする必要がある。 doLayout(); }
③ 上記②で呼ぶレイアウトの定義。
private void doLayout() { // プレイヤーのパラメータを取得 LinearLayout.LayoutParams playerParams = (LinearLayout.LayoutParams) youTubePlayer.getLayoutParams(); // フルスクリーンの場合 if (fullscreen) { // YouTubePlayerの画面サイズを設定 playerParams.width = LinearLayout.LayoutParams.MATCH_PARENT; playerParams.height = LinearLayout.LayoutParams.MATCH_PARENT; // プレイヤー以外を非表示にする toolbar.setVisibility(View.GONE); otherViews.setVisibility(View.GONE); } // フルスクリーンではない場合 else { // プレイヤー以外も表示する toolbar.setVisibility(View.VISIBLE); otherViews.setVisibility(View.VISIBLE); // 「 miniTube 」画面下部のパラメータを取得 ViewGroup.LayoutParams otherViewsParams = otherViews.getLayoutParams(); // 画面を横向きにした場合のレイアウト if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // PlayerとotherViewsのパラメータを設定 playerParams.width = otherViewsParams.width = 0; playerParams.height = WRAP_CONTENT; otherViewsParams.height = MATCH_PARENT; playerParams.weight = 1; // 外枠のレイアウト baseLayout.setOrientation(LinearLayout.HORIZONTAL); } // 画面が縦の場合のレイアウト else { // PlayerとotherViewsのパラメータを設定 playerParams.width = otherViewsParams.width = MATCH_PARENT; playerParams.height = WRAP_CONTENT; playerParams.weight = 0; otherViewsParams.height = MATCH_PARENT; // 外枠のレイアウト baseLayout.setOrientation(LinearLayout.VERTICAL); } } }
③で使用したレイアウトのパーツは下記の様に区分けしています。
緑枠 = toolbar
赤枠 = youTubePlayer
黄枠 = otherViews
上記3つを囲む外枠 = baseLayout
これでいけるはずです!
※スピナーの枠の右に表示されるはずの小さい三角マークが消えました...
extends を Activity から YouTubeBaseActivity に変更したのが原因だと思うのですが謎です。
これはもうスピナーをカスタマイズしろって事なんでしょうか笑