从 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中看到的方法,明确规定了如何在两个之间传递数据碎片。
以下是我遵循的步骤:
- 设置目标片段:
在这里,我通过 setTargetFragment 方法
// set taskFragment as the target fragment of DatePickerFragment
datePicker.setTargetFragment(TaskFragment.this, 0);
datePicker.show(fm, "datePicker");
- 通过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);
- 覆盖目标片段中的 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);
}
}
我在我的 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中看到的方法,明确规定了如何在两个之间传递数据碎片。 以下是我遵循的步骤:
- 设置目标片段: 在这里,我通过 setTargetFragment 方法
// set taskFragment as the target fragment of DatePickerFragment
datePicker.setTargetFragment(TaskFragment.this, 0);
datePicker.show(fm, "datePicker");
- 通过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);
- 覆盖目标片段中的 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);
}
}