2014年7月6日日曜日

Android : TimePickerDialog で onTimeSet に登録した関数が Cancel 時にも呼ばれる(そして2回呼ばれる)

Android 4.1 (Jelly Beans)以降からのバグで、
Dialog の onStop 時にも onTimeSet が呼ばれるようです。
Back キーなどでキャンセルした場合でも呼ばれてしまうという厄介な挙動。

参考1: TimePickerDialog and Jelly Bean, onTimeSet fires on cancel
参考2: Android 4.1.2 dialogs are called twice

参考先では onTimeSet が呼ばれた回数をカウントする方法が紹介されていましたが、
この先どういう挙動になるかもわからないので、
AlertDialog の View に TimePicker をセットして
setPositiveButton の callback で TimePicker の値を取得する方法をとることにしました。
TimePickerDialog でバグを回避する方法を頑張るよりもわかりやすい気がしますね。
setNegativeButton の有無によるキャンセルボタンの有無や、タイトルの設定もしやすいです。

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("My Time Picker Dialog");
final TimePicker tp = new TimePicker(getActivity());
// 初期値を設定したい場合はここで。
// tp.setCurrentHour(0);
// tp.setCurrentMinute(0);
builder.setView(tp);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialogInterface, int i) {
        int hour = tp.getCurrentHour();
        int minute = tp.getCurrentMinute()
        // 処理をする…
    }
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.create().show();

0 件のコメント:

コメントを投稿