DialogFragmentにカスタムビューを設定

DialogFragmentを使ってダイアログをカスタムして表示したい場合、AlertDialogsetViewを使用します。

例えばカスタムビューとして次のようなレイアウトを作ります。

<?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">

    <TextView
        android:id="@+id/copyTextView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="Hello!!"
        android:textSize="36sp"
        android:textStyle="bold"/>

</LinearLayout>

テキストビューだけを持つ単純なレイアウトです。

このレイアウトをダイアログに設定したい場合は次のようにonCreateDialogをオーバーライドすればOKです。

    public Dialog onCreateDialog(Bundle bundle)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        View view = LayoutInflater.from(getActivity()).inflate(
                R.layout.copy_text_dialog, null);
            ///ビューを生成
        
        builder
        .setTitle("Custom Dialog")
        .setPositiveButton("OK", null)
        .setView(view);
        
        return builder.create();
    }

setViewで置き換わるのはボディ部分だけでタイトルや下部のボタンはそのまま残ります。

今回のコードでは次のようなダイアログが表示されました。

カスタムビューを持つDialogFragment

テキストビューを中央寄りにして太字にカスタマイズすることができました。

今度はこのテキストビューのテキストを変更したい場合、getDialogメソッドからfindViewByIdで目的のビューを探し出せます。

ただし、ビューを探す場合はonStartメソッドで呼び出した方が安全です。

    @Override
    public void onStart()
    {
        super.onStart();

        TextView messageTextView = (TextView) getDialog().findViewById(
                R.id.copyTextView);
        messageTextView.setText(copiedText);
    }

onStart以前から呼び出そうとするとまだビューが作られていないのでNullPointerExceptionが返ってきてしまいます。

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