フラグメントを動的に設定する
前回は二つのフラグメントを静的に一つのアクティビティに組み合わせました。
コードの再利用性という観点からはフラグメントを静的に組み合わせるのも良いですが、ディスプレイに合わせて動的に UI を動かす、 という点においては静的な組み合わせは必ずしも望ましいものではありません。
ここでは動的にフラグメントを設定する方法について説明します。
なお、フラグメントは Android 3.0 以降のものであることに注意してください。Android 2 以前の環境では動作しません。
縦向き、横向きでフラグメントを切り替える
ここではディスプレイを縦 (ポートレイト) にした場合と横 (ランドスケイプ) にした場合で、フラグメントを切り替える方法を示します。
横向きの場合はこのような表示で・・・
縦向きの場合は次のようになります。
もっとも、通常縦横だけの切り替えであれば、レイアウトリソースファイルを追加することで簡単に実現可能です。 ここではあくまでフラグメントの差し替え例として、その方法を示します。
ここで利用する白と青のフラグメントは『フラグメントの一番簡単な利用例』で作成したものと同一です。 そちらを参考にしてください。
ここでのポイントはメインのアクティビティです。
前回はメインアクティビティの onCreate にて、setContentView(R.layout.main) としただけでしたが、ここを次のように変更します。
package com.keicode.android.test;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.Display;
import android.view.WindowManager;
public class FragmentTest2Activity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction
= fragmentManager.beginTransaction();
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
if(display.getHeight() < display.getWidth()){
Fragment1 fragment1 = new Fragment1();
fragmentTransaction.replace(android.R.id.content, fragment1);
}
else{
Fragment2 fragment2 = new Fragment2();
fragmentTransaction.replace(android.R.id.content, fragment2);
}
fragmentTransaction.commit();
}
}
フラグメントマネージャ (FragmentManager) なるものが出てきています。
フラグメントマネージャを用いて、ルートビュー (android.R.id.content) とフラグメントを差し替えています (フラグメントトランザクションの replace メソッド)。
尚、縦横判定にはウィンドウマネージャ (WindowManager) でディスプレイオブジェクトを取得して、 その縦横比で判定しています。これによって方向を無視して、縦向き、横向きを判断できます。