4

過去の日付を無効にし、日付ピッカーが次の1か月の将来の日付を表示する必要があることを制限したいのですが、プログラムを変更するにはどうすればよいですか?

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

}

4

1 に答える 1

2

まず、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 による元の実用的な回答へのクレジット

于 2013-03-13T06:31:13.030 に答える