<< Android-Note
DialogFragmentにカスタムビューを設定
DialogFragmentを使ってダイアログをカスタムして表示したい場合、AlertDialogのsetViewを使用します。
例えばカスタムビューとして次のようなレイアウトを作ります。
<?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で置き換わるのはボディ部分だけでタイトルや下部のボタンはそのまま残ります。
今回のコードでは次のようなダイアログが表示されました。
テキストビューを中央寄りにして太字にカスタマイズすることができました。
今度はこのテキストビューのテキストを変更したい場合、getDialogメソッドからfindViewByIdで目的のビューを探し出せます。
ただし、ビューを探す場合はonStartメソッドで呼び出した方が安全です。
@Override public void onStart() { super.onStart(); TextView messageTextView = (TextView) getDialog().findViewById( R.id.copyTextView); messageTextView.setText(copiedText); }
onStart以前から呼び出そうとするとまだビューが作られていないのでNullPointerExceptionが返ってきてしまいます。
© Kaz