フラグメント(DialogFragment)を使ったダイアログを表示

ダイアログはActivityクラスのshowDialogメソッドでも表示できますが、DialogFragmentを使っても表示できます。

ダイアログの表示の仕方は次の通りです。

  1. レイアウトを作る
  2. DialogFragmentを拡張したクラスの作成
  3. Activityクラスでダイアログ表示

レイアウトを作る

普通のフラグメントを作るときと同じようにレイアウトを作ります。

例えば次のようなテキストビュー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.java
package 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つです。

この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です。

以上がフラグメントでダイアログを作る大まかな流れです。

ちなみにダイアログは次のように表示され、普通のダイアログと同じような見た目です。

タイトルが「Fragment Dialog」で中央に「Hello!!!」と表示されたフラグメントダイアログ

以上、フラグメントを使ったダイアログの表示でした。

関連項目
プライバシーポリシー