从Android中的DatePickerFragment获取Date对象

时间:2017-01-19 10:55:18

标签: android date android-dialogfragment datepickerdialog

我在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中从这个日期选择器中检索日期,并将我的类Task中的“date”属性设置为等于所选日期

index.php?page=youtube&user=someone

单击按钮时出现日期选择器。但是,日期未正确设置,并且在按下日期按钮时实际上正在设置日期,而不是从选取器中选择日期时。 此外,在打印日期时,无论我选择哪个日期,都会得到以下内容: I / System.out:TW Dec 31 10:47:38 GMT + 00:00 2 在这里阅读一些解决方案指导我定义onDateSet和getDateFromDatePicker方法,但它们似乎没有正常运行。 非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

经过一番挖掘,我按照我在 Android编程:大书呆子牧场指南一书中读到的方法,明确指出了如何在两个片段之间传递数据。 以下是我遵循的步骤:

  1. 设置目标片段: 在这里,我通过setTargetFragment方法创建了将接收日期(在我的情况下为TaskFragment)DatePickerFragment的目标片段的片段
  2. 
    
        // set taskFragment as the target fragment of DatePickerFragment
        datePicker.setTargetFragment(TaskFragment.this, 0);
        datePicker.show(fm, "datePicker");
    
    
    
    1. 通过DatePickerFragment的onDateSet方法将日期发送到目标片段。我通过将具有日期的intent传递给目标片段的onActivityResult方法来完成此任务。
    2. 
      
          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方法以接受日期
      2. 
        
            @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);
        
                }
            }
        
        
        

答案 1 :(得分:0)

使用DatePickerFragment时,通常会有一个用户选择日期时触发的界面。这称为DatePickerDialog.OnDateSetListener

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

如果您在活动中显示DatePickerFragment,则执行此操作的一种方法是创建一个允许将片段中的消息发送到活动的界面。