Android DatePickerDialog&;TimePickerDialog onXXXSet()版本17+;/-问题

Android DatePickerDialog&;TimePickerDialog onXXXSet()版本17+;/-问题,android,android-datepicker,android-timepicker,datepickerdialog,Android,Android Datepicker,Android Timepicker,Datepickerdialog,请注意,如果这已经存在,我提前道歉。在试图弄明白这一点的过程中,我发现了其中的一些细节,但从未找到整个问题和解决方案。所以我想我会为社区的其他人写出来 DatePickerDialogs(和TimePickerDialogs)上有很多关于如何使用onDateSet()捕获日期/时间集的问题/答案 我在这个对话框功能中发现了一个细微的差别,它产生了一个类似于17版及以下版本的bug,我找到了一个解决方案 问题是 如前所述,如果您想捕获在离开DatePickerDialog时设置的日期,您可以编写和

请注意,如果这已经存在,我提前道歉。在试图弄明白这一点的过程中,我发现了其中的一些细节,但从未找到整个问题和解决方案。所以我想我会为社区的其他人写出来

DatePickerDialogs(和TimePickerDialogs)上有很多关于如何使用onDateSet()捕获日期/时间集的问题/答案

我在这个对话框功能中发现了一个细微的差别,它产生了一个类似于17版及以下版本的bug,我找到了一个解决方案

问题是

如前所述,如果您想捕获在离开DatePickerDialog时设置的日期,您可以编写和onDateSet()方法,并在DatePickerDialog上设置侦听器(通常为“this”)。例如:

public static class MyDatePickerFragment extends DialogFragment
        implements DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        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
        DatePickerDialog dialog =  new DatePickerDialog(getActivity(), **this**, year, month, day);

        return dialog;
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
            blah blah blah
            do the date setting code
    }
}
请注意,这是将MyDatePickerFragment作为onDateSet()侦听器传递到DatePickerDialog的

这在android版本17及以下版本中运行良好。尝试版本18或更高版本,基本上不会发生任何事情。您的日期设置活动会丢失。因此(我发现)另一个建议是向onCreateDialog()添加以下代码:

这对于任何版本18或更高版本都非常有效。也就是说,如果您只是将其添加到onCreateDialog()中,那么您的版本17及以下版本将停止工作。注释掉此代码版本17及以下版本。将其放入,它将停止工作,18及以上版本将继续工作

为了解决这个问题,我用以下方式实现了它:

if(Build.VERSION.SDK_INT > 17) {
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, 
                     getString(R.string.btn_cancel),
                     new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which
                                {
                                    if (which == DialogInterface.BUTTON_NEGATIVE) {
                                        saved = false;
                                    }
                                }
                            });
    dialog.setButton(DialogInterface.BUTTON_POSITIVE,
                     getString(R.string.btn_done),
                     new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which
                                {
                                    if (which == DialogInterface.BUTTON_POSITIVE) {
                                        saved = true;
                                    }
                                }
                            });
}
瞧…!!现在两者都起作用了。同样的范例也适用于TimePickerDialog

我希望这能有所帮助。

请参见上面我的答案

很抱歉,我不知道“回答你自己的问题”的空间现在在这里

if(Build.VERSION.SDK_INT > 17) {
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, 
                     getString(R.string.btn_cancel),
                     new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which
                                {
                                    if (which == DialogInterface.BUTTON_NEGATIVE) {
                                        saved = false;
                                    }
                                }
                            });
    dialog.setButton(DialogInterface.BUTTON_POSITIVE,
                     getString(R.string.btn_done),
                     new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which
                                {
                                    if (which == DialogInterface.BUTTON_POSITIVE) {
                                        saved = true;
                                    }
                                }
                            });
}