我正在開發一個項目,該窗體中有一個生日日期字段。所以我嘗試使用datepicker控件。但是很難設置控件中的最大和最小日期。蜂窩前的版本與蜂窩後的版本不同。以下是我使用的代碼。如何在沒有日期選擇控件的android窗體中設置出生日期
主類:
package com.example.datepickercustom;
import java.util.Calendar;
import java.util.GregorianCalendar;
import android.os.Build;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;
public class MainActivity extends Activity {
Button btndate;
TextView txtdate;
private int intCurrentYear;
private int intCurrentMonth;
private int intCurrentDay;
private int intMaxYear;
private int intMaxMonth;
private int intMaxDay;
private int intMinYear;
private int intMinDay;
private int intMinMonth;
private int year;
private int month;
private int day;
private static final int MILLIS_IN_SECOND = 1000;
private static final int SECONDS_IN_MINUTE = 60;
private static final int MINUTES_IN_HOUR = 60;
private static final int HOURS_IN_DAY = 24;
private static final int DAYS_IN_YEAR = 365;
static final int DATE_PICKER_ID = 1111;
GregorianCalendar calendar;
DatePicker mDatePickerInstance;
DatePickerDialogWithMaxMinRange datePickerDialog= null;
DatePickerDialog.OnDateSetListener datePickerOnDateSetListener;
Calendar myCalendar;
DatePickerDialog dpd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btndate=(Button) findViewById(R.id.btndate);
txtdate=(TextView) findViewById(R.id.txtdate);
final Calendar c = Calendar.getInstance();
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH);
day = c.get(Calendar.DAY_OF_MONTH);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// Show current date
txtdate.setText(new StringBuilder()
// Month is 0 based, just add 1
.append(month + 1).append("-").append(day).append("-")
.append(year).append(" "));
}
else
{
setDate();
}
btndate.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
showDialog(DATE_PICKER_ID);
}
else
{
datePickerDialog.show();
}
}
});
}
@SuppressLint("NewApi")
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_PICKER_ID:
final long MILLISECONDS_IN_YEAR =
(long)MILLIS_IN_SECOND * SECONDS_IN_MINUTE * MINUTES_IN_HOUR
* HOURS_IN_DAY * DAYS_IN_YEAR;
Calendar now = Calendar.getInstance();
calendar=new GregorianCalendar();
int current_year=now.get(Calendar.YEAR);
// open datepicker dialog.
// set date picker for current date
// add pickerListener listner to date picker
dpd=new DatePickerDialog(this, pickerListener, year, month,day);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
//Calendar.getInstance().get(Calendar.YEAR)-19
dpd.getDatePicker().setMaxDate((current_year-16-1970)*MILLISECONDS_IN_YEAR);
dpd.getDatePicker().setMinDate((current_year-100-1970)*MILLISECONDS_IN_YEAR);
}
return dpd;
}
return null;
}
public void setDate() {
/*
* Initialise Listener for date set
*/
txtdate.setText(new StringBuilder().append(year)
.append("-").append(month + 1).append("-")
.append(day));
datePickerOnDateSetListener = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
txtdate.setText(new StringBuilder().append(year)
.append("-").append(monthOfYear + 1).append("-")
.append(dayOfMonth));
}
};
// initialise DatePicker
myCalendar = Calendar.getInstance();
intCurrentYear = myCalendar.get(Calendar.YEAR);
intCurrentMonth = myCalendar.get(Calendar.MONTH);
intCurrentDay = myCalendar.get(Calendar.DAY_OF_MONTH);
intMaxYear = intCurrentYear-18;
intMaxMonth = intCurrentMonth;
intMaxDay = intCurrentDay;
intMinYear = intCurrentYear-100;
intMinMonth = intCurrentMonth;
intMinDay = intCurrentDay;
datePickerDialog = new DatePickerDialogWithMaxMinRange(
this, datePickerOnDateSetListener,intMinYear,intMinMonth,intMinDay,intMaxYear,intMaxMonth,intMaxDay);
}
private DatePickerDialog.OnDateSetListener pickerListener = new DatePickerDialog.OnDateSetListener() {
// when dialog box is closed, below method will be called.
@Override
public void onDateSet(DatePicker view, int selectedYear,
int selectedMonth, int selectedDay) {
year = selectedYear;
month = selectedMonth;
day = selectedDay;
// Show selected date
txtdate.setText(new StringBuilder().append(month + 1)
.append("-").append(day).append("-").append(year)
.append(" "));
}
};
}
的版本中的自定義類之前的蜂窩到:
package com.example.datepickercustom;
import android.app.DatePickerDialog;
import android.content.Context;
import android.widget.DatePicker;
public class DatePickerDialogWithMaxMinRange extends DatePickerDialog {
static int maxYear=2005;
static int maxMonth=11;
static int maxDay=31;
int minYear=1955;
int minMonth=0;
int minDay=1;
public DatePickerDialogWithMaxMinRange(Context context, OnDateSetListener callBack,int minYear,int minMonth,int minDay,int maxYear,int maxMonth,int maxDay) {
super(context,callBack, maxYear, maxMonth, maxDay);
this.minDay = minDay;
this.minMonth = minMonth;
this.minYear = minYear;
DatePickerDialogWithMaxMinRange.maxDay = maxDay;
DatePickerDialogWithMaxMinRange.maxMonth = maxMonth;
DatePickerDialogWithMaxMinRange.maxYear = maxYear;
}
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
super.onDateChanged(view, year, monthOfYear, dayOfMonth);
if (year > maxYear ||monthOfYear > maxMonth && year == maxYear||
dayOfMonth > maxDay && year == maxYear && monthOfYear == maxMonth){
view.updateDate(maxYear, maxMonth, maxDay);
}else if(year < minYear ||monthOfYear < minMonth && year == minYear||
dayOfMonth < minDay && year == minYear && monthOfYear == minMonth){
view.updateDate(minYear, minMonth, minDay);
}
}
}
我的問題是,上述出現長期艱苦設置birth.Is的日期有沒有更好的做上述?