【问题标题】:Extending DialogFragment for a MaterialDatePicker为 MaterialDatePicker 扩展 DialogFragment
【发布时间】:2021-08-29 18:18:21
【问题描述】:

我想从 DatePickerDialog 迁移到 MaterialDatePicker。 我从 MaterialDatePicker 调用 getDialog 时遇到了问题,对话框结果始终为空

这是一个错误,还是 MaterialDatePicker 不支持该功能?

DatePickerDialog

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() 的结果总是为空?

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();
    }
}

【问题讨论】:

    标签: java android dialogfragment materialdatepicker


    【解决方案1】:

    MaterialDatePicker 已经是 DialogFragment。在您的情况下,picker.getDialog() 返回 null,因为在后台,DialogFragment 将值写入 DialogFragment.mDialog(此字段的值返回picker.getDialog()) 从生命周期回调 onCreateDialog() 提交,在调用对话框的显示后将调用异步方法,即当您调用picker.show(fragmentManager) 时,然后在picker 的onCreateDialog 中,您将可以从getDialog() 方法中获取非空值。

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

    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
    }
    
    

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

    【讨论】:

    • 感谢兄弟的帮助,现在可以了。
    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2012-10-28
    • 2020-10-23
    相关资源
    最近更新 更多