2013年11月22日

[Android] AlertDialogのgetButton()がnullを返す

DialogのOKボタン(Positiveボタン)の長押しを判定したくて、以下のようなコードを書きました。
Builder builder = new Builder(getActivity());
builder.setTitle("title").setMessage("message");
builder.setPositiveButton(android.R.string.ok, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
}
});

AlertDialog dialog = builder.create();
Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
positiveButton.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});


これを実行すると、NullPointerExceptionが発生してアプリが異常終了しました。
11行目のdialog.getButton()でnullが返却されているためです。
Webを検索してみると以下の情報が見つかりました。

Issue 6360 - android - AlertDialog getButton() return null - Android Open Source Project - Issue Tracker - Google Project Hosting

どうもDialogを表示してからでないとnullになってしまうようです。
ソースコードを読んでみるとDialogのonCreate()を通らないと中のViewが生成されないようですね(たぶん)。
Dialogが表示されたところでOnLongClickListenerをセットすることにしました。


Builder builder = new Builder(getActivity());
// ... 省略 ...

AlertDialog dialog = builder.create();
dialog.setOnShowListener(new OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
Button positiveButton = ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE);
positiveButton.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
}
});


多少めんどくさいですが、これなら大丈夫でした。
posted by t2low at 21:00| Android