如何在没有日期选择器控制的情况下在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 );
                }
    }
}

我的问题是,上面的内容似乎很长,很难设定出生日期。有比这更好的方法吗?

DatePicker具有setMinDate和setMaxDate方法。用它们设置最短和最长日期非常容易。

你在这下面是什么意思?:

蜂窝工作之前的版本与蜂窝工作之后的版本不同蜂窝

当然有区别。DatePicker与当前的安卓版本匹配,对于任何控件,都应该有的差异。

您可以使用第三方库来显示日历视图,然后单击即可选择所需日期。我也使用了时间广场的利布,目的相同,非常好。看看这里。还有另一个很好的库检查THIS
在对话框中使用它们,并在完成日期选择后取消对话框。如前所述,您还可以在所需的任何日期范围内显示视图。所以你可以设置一个最长和最短日期。只需正确阅读用法及其简单有效的

相关内容

最新更新