Android 日期选择器:如何在单击按钮时弹出日期选择器并将值存储在变量中

Android Datepicker: How to popup datepicker when click on button and store value in variable

我正在尝试解决 here 中描述的相同问题。选择日期后,我希望用它打开浏览器。还应该注意的是,我是从片段中做这项工作的。

我正在使用第二种解决方案,但面临两个问题:

  1. 当我按下 ChooseDate 按钮时,DatePicker 会弹出,但在我可以选择日期之前,应用程序已经打开浏览器并显示旧日期。当我按下后退按钮时,我看到 DatePicker 并且我可以选择一个日期,如果我再次按下 ChooseDate 按钮然后浏览器打开几乎(见 2)所需的日期,然后按下返回我仍然看到 DatePicker 等等.
  2. DatePicker returns 偏移量为 -1 的月份。例如。我选择三月,我得到二月。它发生在模拟器和 Nexus 5 设备上。 mCalender 是公历。

我的问题:

  1. 我怎样才能让日历一直保留到我选择一个日期,然后让它消失?

  2. 有没有其他人遇到日历提供的错误月份(我重新构建了应用程序,关闭并打开 Android Studio),如果是,您对此做了什么(其他然后是明显的 +1 hack)

我正在使用 Android Studio 1.1.0,API 21.

谢谢!

代码:

        mChooseDateButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            openBrowser(CHOOSE_DAY);
        }
    });

void openBrowser(int option) {

    String date = "";

    switch (option) {
        ...

        case CHOOSE_DAY:
            chooseDate();
            date = mChosenDate;
            break;

        ...
    }


    String url = getUrl(date);

    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    startActivity(browserIntent);
}


...

void chooseDate() {

    int year = mCalendar.get(Calendar.YEAR);
    int month = mCalendar.get(Calendar.MONTH);
    int day = mCalendar.get(Calendar.DAY_OF_MONTH);
    DatePickerDialog dialog = new DatePickerDialog(this.getActivity(),
            new DateSetListener(), year, month, day);
    dialog.show();
}

class DateSetListener implements DatePickerDialog.OnDateSetListener {

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear,
                          int dayOfMonth) {
        // TODO Auto-generated method stub
        int chosenMonth = monthOfYear;
        int chosenDay = dayOfMonth;
        Log.i("DEBUG","chosen month: " + chosenMonth);
        updateChosenDate(chosenMonth,chosenDay);
    }
}

你需要移动这个:

String url = getUrl(date);

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(browserIntent);

DateSetListener 调用 onDateSet 的方法,因此它不会在您实际设置日期之前触发。您当前的代码将通过 switch case 运行 并启动意图,而无需等待 openBrowser() 中的对话框。

月份的问题可能是因为日历从 0 开始,而提供的值并未抵消这一点。所以只需增加 1.