Innerzone’s Android blog

プログラムのメモとその他雑記。

[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

f:id:Innerzone:20150317164854p:plain

これでいけるはずです!

※スピナーの枠の右に表示されるはずの小さい三角マークが消えました...

  extends を Activity から YouTubeBaseActivity に変更したのが原因だと思うのですが謎です。

  これはもうスピナーをカスタマイズしろって事なんでしょうか笑