首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为DialogFragment扩展MaterialDatePicker

为DialogFragment扩展MaterialDatePicker
EN

Stack Overflow用户
提问于 2021-06-13 15:53:10
回答 1查看 226关注 0票数 0

我想从DatePickerDialog迁移到MaterialDatePicker.在从MaterialDatePicker调用getDialog时遇到了问题,对话框的结果总是为null

这是一个错误,还是MaterialDatePicker不支持的特性?

DatePickerDialog

代码语言:javascript
复制
private static class BirthDateUpdater extends DialogFragment implements DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // create calendar instance
        final Calendar c = Calendar.getInstance();

        // set calendar to birthdate
        c.setTimeInMillis(getBirthDate().getTime());

        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // process date selected in here
    }
}

这里的MaterialDatePicker问题- picker.getDialog()的结果总是null吗?

代码语言:javascript
复制
public static class BirthDateUpdater extends DialogFragment implements 
    MaterialPickerOnPositiveButtonClickListener<Long>, 
    DialogInterface.OnCancelListener {
    
    private Dialog dialog;

    public BirthDateUpdater() {
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        try {
            // builder
            MaterialDatePicker.Builder<Long> builder = MaterialDatePicker.Builder.datePicker();
            builder.setTitleText("Select Date");

            // set date to BirthDate
            builder.setSelection(getBirthDate().getTime());

            // picker
            MaterialDatePicker<Long> picker = builder.build();
            
            // add event
            picker.addOnPositiveButtonClickListener(this);
            picker.addOnCancelListener(this);

            // dialog
            dialog = picker.getDialog(); // error in here (dialog is null)?

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return dialog;
    }

    @Override
    public void onPositiveButtonClick(Long selection) {
        try {
            Calendar dateSelected = Calendar.getInstance();
            dateSelected.setTimeInMillis(selection);
            
            // process date selected in here
            
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    @Override
    public void onCancel(@NonNull DialogInterface dialog) {
        dialog.dismiss();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-13 18:00:57

MaterialDatePicker已经是DialogFragment了。在您的示例中,picker.getDialog()返回null,因为在掩码下,DialogFragment对DialogFragment.mDialog的写值(该字段的值返回picker.getDialog())来自生命周期回调onCreateDialog(),它将在调用对话框的显示方法后被调用异步,也就是说,当您调用picker.show(fragmentManager)时,您可以从getDialog()方法获得非空值。

在您的情况下,您不应该扩展DialogFragment或MaterialDatePicker (这是最终的),而是可以创建像birthDateUpdater这样的方法

代码语言:javascript
复制
public DialogFragment birthDateUpdater() {
            MaterialDatePicker.Builder<Long> builder = MaterialDatePicker.Builder.datePicker();
            builder.setTitleText("Select Date");

            // set date to BirthDate
            builder.setSelection(getBirthDate().getTime());

            // picker
            MaterialDatePicker<Long> picker = builder.build();
            
            // add event
            picker.addOnPositiveButtonClickListener(selection -> {
              try {
              Calendar dateSelected = Calendar.getInstance();
              dateSelected.setTimeInMillis(selection);
            
               // process date selected in here
            
               } catch (Exception ex) {
                 ex.printStackTrace();
               }
            });
            picker.addOnCancelListener(dialog -> {
               dialog.dismiss();
            });
            return picker
}

或者创建类,工厂,任何封装这个逻辑的东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67960136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档