DialogをカスタマイズするならDialogを継承した独自Viewを作成したほうが捗る

AlertDialogをカスタムする方法は巷に溢れてるけど、カスタマイズするのが非常にめんどくさかったのでDialogを継承して独自Viewとして作成したら捗ったのでメモ

サンプル

ソース

public class WarningDialog extends Dialog {

	private TextView txtWarning;
	private RelativeLayout rltWarning;
	private View.OnClickListener listener;
	private String warningText;
	
	public WarningDialog(Context context) {
		super(context, android.R.style.Theme_Translucent_NoTitleBar);
	}

	@Override
	protected void onCreate(Bundle bundle) {
		super.onCreate(bundle);
		setContentView(R.layout.warning);
		
		txtWarning = (TextView)findViewById(R.id.txtWarning);
		txtWarning.setText(this.warningText);
		
		rltWarning = (RelativeLayout)findViewById(R.id.rltWarning);
		rltWarning.setOnClickListener(this.listener);
	}
	
	public void setWarningText(String warningText) {
		this.warningText = warningText;
	}
	
	public void setCallbackListener(View.OnClickListener listener) {
		this.listener = listener;
	}
}

xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rltWarning"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center|center"
    android:layout_margin="20dp"
    android:clickable="true"
    android:background="@drawable/warning_bg" >

    <ImageView
        android:id="@+id/imgWarning"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:scaleType="centerCrop"
        android:src="@drawable/warning_icon" />

    <TextView
        android:id="@+id/txtWarning"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/imgWarning"
        android:layout_margin="30dp"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

使い方

	final WarningDialog dialog = new WarningDialog(getApplicationContext());
	dialog.setWarningText(getString(R.string.waring));
	dialog.setCallbackListener(new View.OnClickListener() {
		@Override
		public void onClick(View v) {
			dialog.dismiss();
		}
	});
	dialog.show();

解説

このサンプルは独自デザインのWarningを出しているサンプル。表示されているDialogをタップすることでDialogが消える。

onCreateのsetContentViewで独自デザインのxmlを渡すことでDialogを作成する。後は入れたい値とかちょっとしか変更しないものとかをsetter作って渡してあげて、onCreate時に設定された値を表示して上がれば問題なく動く。.show()のタイミングでonCreateが走るようなので、setterでそのままViewに値を設定してあげようとするとぬるぽで落ちるからちょっと注意が必要。後、android:layout_gravity=”center|center”を設定しないと中央に来ないのでちゃんと設定してあげましょう。

感想

これならAlertDialogのBackgroundの黒が気に食わないとか、Titleの場所が気に食わないとかボタンをもっと増やしたいとか色々細かいところまで触りたおせる。標準部品で作るならAlertDialogとかAndroidが標準で提供しているものを使ったほうがいいけど、凝ったデザインとか作る場合はこっちのほうが捗るぞ。なにかこれじゃだめだろとかツッコミがあればよろしくどうぞ。