フラグメント(DialogFragment)を使ったダイアログを表示
ダイアログはActivityクラスのshowDialogメソッドでも表示できますが、DialogFragmentを使っても表示できます。
ダイアログの表示の仕方は次の通りです。
レイアウトを作る
普通のフラグメントを作るときと同じようにレイアウトを作ります。
例えば次のようなテキストビュー1つだけを持つようなレイアウトファイルをfragment_dialog.xmlとします。
fragment_dialog.xml
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:gravity="center"
android:text="Hello!!!"
android:textSize="24sp" />
</LinearLayout>
このレイアウトファイルがダイアログの中心に表示されるレイアウトになります。
DialogFragmentクラスの作成
次にDialogFragmentを拡張してダイアログとして表示したいフラグメントを作成します。
例えばTestDialogFragmentなどの名前で次のようなフラグメントを作ります。
TestDialogFragment.javapackage com.MyApp.myapp; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.support.v4.app.DialogFragment; //DialogFragmentのサポートクラスをインポート public class TestDialogFragment extends DialogFragment { public static TestDialogFragment newInstance() { return new TestDialogFragment(); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Activity activity = getActivity(); AlertDialog.Builder builder = new AlertDialog.Builder(activity); final View dialogView = LayoutInflater.from(activity).inflate(R.layout.fragment_dialog, null); builder.setView(dialogView) .setTitle("Fragment Dialog") .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ((MainActivity)activity).onTestDialogOKClick(); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { TestDialogFragment.this.dismiss(); } }); return builder.create(); } }
DialogFragmentはAPIレベルが11の時に追加されたのでAPIレベルが低い端末でも動作するようにandroid.support.v4.app.DialogFragmentというサポートクラスを代わりに使用しています。
DialogFragmentの表示に関わっているメソッドが次の2つです。
- onCreateDialogメソッド
このメソッド内でダイアログインスタンスを作り、フラグメント上で表示するダイアログを返します。
- showメソッド
ダイアログを表示するメソッドでアクティビティクラスから呼びます。
この2つのメソッドが主に表示に関わっています。もしAlertDialogなどのダイアログクラスを使わない場合はonCreateViewメソッドでもダイアログを作ることもできます。
ダイアログの表示
最後にアクティビティクラスでDialogFragmentからダイアログを表示する処理を書きます。たとえば次ようなコードです。
public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button showDialogButton = (Button) findViewById(R.id.show_dialog_button); showDialogButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { showFragmentDialog(TEST_DIALOG); //ダイアログの表示 } }); } /**フラグメントダイアログを表示する。*/ final int TEST_DIALOG = 0; public void showFragmentDialog(int id) { switch(id){ case TEST_DIALOG: DialogFragment dialogFragment = TestDialogFragment.newInstance(); dialogFragment.show(getSupportFragmentManager(), "fragment_dialog"); } } /**OKボタンが押されたことを感知する。*/ public void onTestDialogOKClick() { Log.i("MainActivity : ", "OK clicked."); } }
フラグメントを使うのでアクティビティクラスはFragmentActivityをベースにしています。
ダイアログを表示するときアクティビティにはフラグメントダイアログを表示するメソッドはないので自作する必要があります。
もしダイアログにOKボタンなどがついている場合、そのクリックを受け取るにはこの例のonTestDialogOKClickメソッドのようにメソッドを自作すればOKです。
以上がフラグメントでダイアログを作る大まかな流れです。
ちなみにダイアログは次のように表示され、普通のダイアログと同じような見た目です。
以上、フラグメントを使ったダイアログの表示でした。