从 Android 中的 DatePicker 片段获取日期对象

Get Date object from DatePickerFragment in Android

我在我的 android 应用程序中定义了 DatePickerFragment,这是它的代码:

public class DatePickerFragment extends DialogFragment implements
        DatePickerDialog.OnDateSetListener {

    private int year;
    private int month;
    private int day;


    @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
        return new DatePickerDialog(getActivity(), this, year, month, day);

    }

    @Override
    public void onDateSet(DatePicker view, int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public Date getDateFromDatePicker(){
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month, day);
        return calendar.getTime();
    }
}

我想从 TaskFragment 的这个日期选择器中检索日期,并将我的 class 任务中的 "date" 属性设置为等于日期 selected

        // Method for date picker to appear once the "Due Date" button is clicked.
    datePickerButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentManager fm = getActivity().getFragmentManager();
            DatePickerFragment datePicker = new DatePickerFragment();
            datePicker.show(fm, "datePicker");

            task.setDate(datePicker.getDateFromDatePicker());
           //test
           System.out.println(task.getDate());


        }
    });

单击按钮时会出现日期选择器。但是,日期设置不正确,实际上是在按下日期按钮后立即设置的,而不是从选择器中 selected 时设置的。 此外,在打印日期时,无论我 select 是什么日期,我都会得到以下信息: I/System.输出:12 月 31 日星期三 10:47:38 GMT+00:00 2 阅读此处的一些解决方案指导我定义 onDateSet 和 getDateFromDatePicker 方法,但它们似乎无法正常运行。 非常感谢任何帮助,谢谢!

当使用 DatePickerFragment 时,您通常会有一个在用户选择日期时触发的界面。这叫做DatePickerDialog.OnDateSetListener

在您的代码中,您显示了选择器,然后立即设置日期,而不是等待用户选择。所以你需要做的是当onDateSet回调方法被触发时,然后对日期做你想做的事情。

如果您在 Activity 中显示 DatePickerFragment,一种方法是创建一个接口,允许将消息从您的 Fragment 发送到 activity。

经过一些挖掘,我按照我在书Android Programming: The Big Nerd Ranch Guide中看到的方法,明确规定了如何在两个之间传递数据碎片。 以下是我遵循的步骤:

  1. 设置目标片段: 在这里,我通过 setTargetFragment 方法


    // set taskFragment as the target fragment of DatePickerFragment
    datePicker.setTargetFragment(TaskFragment.this, 0);
    datePicker.show(fm, "datePicker");


  1. 通过DatePickerFragment的onDateSet方法向目标Fragment发送日期。我通过将带有日期的意图传递给目标片段的 onActivityResult 方法来做到这一点。


    public void onDateSet(DatePicker view, int year, int month, int day) {
        // create date object using date set by user
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month, day);
        Date date = calendar.getTime();

        if (getTargetFragment() == null)
            return;

        Intent intent = new Intent();
        intent.putExtra(DATE, date);

        // pass intent to target fragment
        getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent);


  1. 覆盖目标片段中的 onActivityResult 方法以接受日期


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != Activity.RESULT_OK){
            return;
        }

        if (requestCode == REQUEST_DATE){
            Date date = (Date) data.getSerializableExtra(DatePickerFragment.DATE);
            task.setDate(date);

        }
    }