为 MaterialDatePicker 扩展 DialogFragment

如何解决为 MaterialDatePicker 扩展 DialogFragment

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

解决方法

MaterialDatePicker 已经是 DialogFragment。在你的情况下 picker.getDialog() 返回 null 因为在引擎盖下 DialogFragment 写入值到 DialogFragment.mDialog(value of this field returns picker.getDialog()) 从生命周期回调 onCreateDialog() 提交,它将在调用后被称为异步对话框的 show 方法,即当您调用 picker.show(fragmentManager) 然后在选择器的 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
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?