【问题标题】:android date picker安卓日期选择器
【发布时间】:2013-03-13 05:54:33
【问题描述】:

我想限制过去的日期应该被禁用并且日期日期选择器必须显示下一个月的未来日期我该如何修改程序

package com.sample.DatePickerExample;

import android.app.Activity;
import java.util.Calendar;
import android.app.DatePickerDialog;
import android.widget.DatePicker;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class DatePickerExampleActivity extends Activity {

private TextView mDateDisplay;
private int mYear;
private int mMonth;
private int mDay;
static final int DATE_DIALOG_ID = 1;
@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.date_picker);
    mDateDisplay = (TextView) findViewById(R.id.dateDisplay);
    Button pickDate = (Button) findViewById(R.id.pickDate);
    pickDate.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            showDialog(DATE_DIALOG_ID);
        }
    });
    final Calendar c = Calendar.getInstance();
    mDay = c.get(Calendar.DAY_OF_MONTH);
    mMonth = c.get(Calendar.MONTH);
    mYear = c.get(Calendar.YEAR);


    updateDisplay();
}
@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {

    case DATE_DIALOG_ID:
        return new DatePickerDialog(this,
            mDateSetListener,
            mYear, mMonth, mDay);
    }
    return null;
}
protected void onPrepareDialog(int id, Dialog dialog) {
    switch (id) {

    case DATE_DIALOG_ID:
        ((DatePickerDialog) dialog).updateDate(mYear, mMonth, mDay);
        break;
    }
}   
private void updateDisplay() {
    mDateDisplay.setText(
        new StringBuilder()
        // Month is 0 based so add 1

        .append(mDay).append("-")
        .append(mMonth + 1).append("-")
        .append(mYear).append(" "));
}
private DatePickerDialog.OnDateSetListener mDateSetListener =
    new DatePickerDialog.OnDateSetListener() {

    public void onDateSet(DatePicker view, int year, int monthOfYear,
            int dayOfMonth) {
         mDay = dayOfMonth;
        mYear = year;
        mMonth = monthOfYear;

        updateDisplay();
    }
};

}

【问题讨论】:

  • 提供验证而不是禁用日期并且也不要使用日期选择器对话框,因为它已被弃用,使用 DateDialogFragment 或带有日期选择器的警报对话框

标签: android datepicker datepickerdialog


【解决方案1】:

首先,您可以使用DatePicker 小部件来执行此操作。它具有用于设置范围的内置方法。

但是由于您使用的是DatePickerDialog,您需要有一个自定义实现。您需要在选择不期望的日期时,您需要以编程方式将所选日期更改为默认值。

按照此代码:

public class MyDatePickerDialog extends DatePickerDialog{

private Date maxDate;
private Date minDate;

public MyDatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {
    super(context, callBack, year, monthOfYear, dayOfMonth);        
    init(year, monthOfYear, dayOfMonth);
}

public MyDatePickerDialog(Context context, int theme, OnDateSetListener callBack, int year, int monthOfYear,    int dayOfMonth) {
    super(context, theme, callBack, year, monthOfYear, dayOfMonth);
    init(year, monthOfYear, dayOfMonth);
}

private void init(int year, int monthOfYear, int dayOfMonth){
    Calendar cal = Calendar.getInstance();

    cal.set(1970, Calendar.JANUARY, 1);
    minDate = cal.getTime();

    cal.set(3000, Calendar.JANUARY, 1);
    maxDate = cal.getTime();

    cal.set(year, monthOfYear, dayOfMonth);
}

public void onDateChanged (final DatePicker view, int year, int month, int day){
    Calendar cal = Calendar.getInstance();
    cal.set(year, month, day);
    Date currentDate = cal.getTime();

    final Calendar resetCal = cal; 
    if(!minDate.before(currentDate) ){
        cal.setTime(minDate);
        view.updateDate(resetCal.get(Calendar.YEAR), resetCal.get(Calendar.MONTH), resetCal.get(Calendar.DAY_OF_MONTH));

    }else if(maxDate.before(currentDate)){
        cal.setTime(maxDate);
        view.updateDate(resetCal.get(Calendar.YEAR), resetCal.get(Calendar.MONTH), resetCal.get(Calendar.DAY_OF_MONTH));
    }       
}

public void setMaxDate(Date date){
    this.maxDate = date;
}

public void setMinDate(Date date){
    this.minDate = date;
}   }

感谢 Herrmann 的 original working answer

【讨论】:

    猜你喜欢
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多