【问题标题】:Get Date object from DatePickerFragment in Android从 Android 中的 DatePickerFragment 获取 Date 对象
【发布时间】:2017-06-04 01:10:53
【问题描述】:

我已经在我的 android 应用程序中定义了 DatePickerFragment,下面是它的代码:

公共类 DatePickerFragment 扩展 DialogFragment 实现 DatePickerDialog.OnDateSetListener { 私人 int 年; 私人 int 月; 私人国际日; @覆盖 公共对话 onCreateDialog(Bundle savedInstanceState) { // 使用当前日期作为选择器中的默认日期 最终日历 c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int 月 = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); // 创建一个新的 DatePickerDialog 实例并返回它 return new DatePickerDialog(getActivity(), this, year, month, day); } @覆盖 public void onDateSet(DatePicker view, int year, int month, int day) { this.year = 年; this.month = 月; this.day = 天; } 公共日期 getDateFromDatePicker(){ 日历日历 = Calendar.getInstance(); calendar.set(年、月、日); 返回日历.getTime(); } }

我想从 TaskFragment 的这个日期选择器中检索日期,并将我的类 Task 中的“日期”属性设置为等于所选日期

        // 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());


        }
    });

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

【问题讨论】:

  • 你在哪里显示日期选择器,在活动中?
  • 在名为 TaskFragment 的片段中没有。
  • 我发现对方法 getDateFromDatePicker 的调用发生在调用 onDateSet 方法之前,所以我想我必须从 onDateSet 获取值并将它们存储在某个地方,以便它们可以被TaskFragment 类。

标签: android date android-dialogfragment datepickerdialog


【解决方案1】:

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

  1. 设置目标片段: 在这里,我通过 setTargetFragment 方法将接收日期的 Fragment(在我的情况下为 TaskFragment)作为 DatePickerFragment 的目标片段
// 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); } }

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-06-16
      • 2022-07-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 2014-10-25
      相关资源
      最近更新 更多