Post

DatePicker and TimePicker

ダイアログは,DialogFragmentとともに使用するべきです.端末の回転後,DialogFragmentのインスタンスが自動的に再生成され,onCreateDialog()メソッドが呼び出され,ダイアログのインスタンスも再生成されます.その際に,イベントリスナー1⃣なども設定されます.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MainActivity extends AppCompatActivity {
    public void foo(MenuItem menuItem) {
        new DialogFragment2().show(getSupportFragmentManager(), "");
    }

    public static class DialogFragment2 extends DialogFragment {
        @NonNull
        @Override
        public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
            return new MaterialAlertDialogBuilder(requireContext())
                    .setPositiveButton("...",  (dialog, which) -> {
                        ...
                    })//1⃣
                    .create();
        }
    }
}

MaterialDatePickerMaterialTimePickerは,日付,時刻の選択ツールで,DialogFragmentをextendsしています.端末の回転後,日付,時刻選択ツールのインスタンスは自動的に再生成されます.その際に,イベントリスナー2⃣などは設定されません.アクティビティが(再)生成された際に,起動されている日付,時刻選択ツールにイベントリスナー3⃣などを設定することができます(https://github.com/material-components/material-components-android/issues/1688https://github.com/material-components/material-components-android/issues/4498).もっといい方法はないでしょうか? ViewをextendsするMaterialDatePicker,MaterialTimePickerがあればいいですね(https://github.com/material-components/material-components-android/issues/3429https://github.com/material-components/material-components-android/issues/1799).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        Fragment fragment = getSupportFragmentManager().findFragmentByTag("MaterialDatePicker");
        if (fragment instanceof MaterialDatePicker<?>) {
            ((MaterialDatePicker<?>)fragment).addOnPositiveButtonClickListener(selection -> {
                ...
            });//3⃣
        }
    }

    public void bar(MenuItem menuItem) {
        MaterialDatePicker<?> materialDatePicker = MaterialDatePicker.Builder.datePicker().build();
        materialDatePicker.addOnPositiveButtonClickListener(selection -> {
            ...
        });//2⃣
        materialDatePicker.show(getSupportFragmentManager(), "MaterialDatePicker");
    }
}
This post is licensed under CC BY 4.0 by the author.