如何在按钮点击时显示DatePickerDialog?

72

我正在开发一款需要用户选择日期(dd/mm/yyyy)的应用程序。我想在按钮单击时显示一个带有DatePicker的对话框。 选择日期后,它必须显示在EditText中。

我正在使用Android Studio 2.2,该项目的min sdk为23。

请帮助我编写所需的代码。


2
嗨,你可以尝试这个链接,它可能会对你有所帮助:https://dev59.com/dGUp5IYBdhLWcg3w8LB4 - Dileep Patel
http://blog.nkdroidsolutions.com/android-custom-date-picker-dialog-example/ - duggu
4个回答

81

enter image description here

在你的build.gradle文件中添加最新的appcompat库,目前版本是24.2.1。
dependencies {  
    compile 'com.android.support:appcompat-v7:X.X.X' 
    // where X.X.X version
}

II. 让您的活动扩展 android.support.v7.app.AppCompatActivity 并实现 DatePickerDialog.OnDateSetListener 接口。

public class MainActivity extends AppCompatActivity  
    implements DatePickerDialog.OnDateSetListener {

III. 创建DatePickerDialog,需要设置上下文、实现监听器以及设置日期选择器的起始年、月和日。

DatePickerDialog datePickerDialog = new DatePickerDialog(  
    context, MainActivity.this, startYear, starthMonth, startDay);

IV. 在按钮的点击事件监听器中显示您的对话框

((Button) findViewById(R.id.myButton))
    .setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        datePickerDialog.show();
    }
});

太好了!我完成了前两个步骤,第三步我需要做什么?@Saulmm - Pratik Pitale
1
只需根据代码片段中填写所需参数的方式获取日期选择器对话框的实例,并从您按钮的监听器中启动它。 - saulmm
安全异常 - Roman Soviak

46
    final Calendar newCalendar = Calendar.getInstance();
    final DatePickerDialog  StartTime = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
                public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                    Calendar newDate = Calendar.getInstance();
                    newDate.set(year, monthOfYear, dayOfMonth);
                    activitydate.setText(dateFormatter.format(newDate.getTime()));
                }
    
            }, newCalendar.get(Calendar.YEAR), newCalendar.get(Calendar.MONTH), newCalendar.get(Calendar.DAY_OF_MONTH));
    
      btn_checkin.setOnClickListener(new View.OnClickListener() {
@Override   public void onClick(View v) {
         StartTime.show():    
     });

1
只需在顶部添加 final Calendar newCalendar = Calendar.getInstance(); ... 然后就完美了。 - Paul Paku

18

对我来说可以运行。如果您想启用选择未来日期的功能,您必须删除最大日期。您需要按照以下步骤操作。

 btnDate.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
          DialogFragment newFragment = new DatePickerFragment();
              newFragment.show(getSupportFragmentManager(), "datePicker");
          }
     });
            
     public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
              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);
              DatePickerDialog dialog = new DatePickerDialog(getActivity(), this, year, month, day);
              dialog.getDatePicker().setMaxDate(c.getTimeInMillis());
              return  dialog;
         }
            
         public void onDateSet(DatePicker view, int year, int month, int day) {
              btnDate.setText(ConverterDate.ConvertDate(year, month + 1, day));
         }
     }
 }

1
看起来不错!ALLOW_PAST是什么@Kayra - Pratik Pitale
你不必使用它,这是给我的。你可以使用这个。 - Volkan Sonmez

9

以下代码是可行的:

datePickerButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDialog(0);
        }
    });

@Override
@Deprecated
protected Dialog onCreateDialog(int id) {
    return new DatePickerDialog(this, datePickerListener, year, month, day);
}

private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() {
    public void onDateSet(DatePicker view, int selectedYear,
                          int selectedMonth, int selectedDay) {
        day = selectedDay;
        month = selectedMonth;
        year = selectedYear;
        datePickerButton.setText(selectedDay + " / " + (selectedMonth + 1) + " / "
                + selectedYear);
    }
};

可用但已弃用。 - artem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接