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