DatePicker 输入生日非常痛苦。这是我的解决方案:
实用程序
public static final SimpleDateFormat BIRTHDAY_FORMAT_PARSER = new SimpleDateFormat("yyyy-MM-dd");
public static final String DASH_STRING = "-";
public static Calendar parseDateString(String date) {
Calendar calendar = Calendar.getInstance();
BIRTHDAY_FORMAT_PARSER.setLenient(false);
try {
calendar.setTime(BIRTHDAY_FORMAT_PARSER.parse(date));
} catch (ParseException e) {}
return calendar;
}
public static boolean isValidBirthday(String birthday) {
Calendar calendar = parseDateString(birthday);
int year = calendar.get(Calendar.YEAR);
int thisYear = Calendar.getInstance().get(Calendar.YEAR);
return year >= 1900 && year < thisYear;
}
主要活动
private void setupBirthdayEditText() {
mBirthdayEditText.addTextChangedListener(new TextWatcher() {
int beforeTextChangedLength;
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
beforeTextChangedLength = charSequence.length();
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (!TextUtils.isEmpty(mBirthdayTextInputLayout.getError())) {
mBirthdayTextInputLayout.setError(null);
mBirthdayTextInputLayout.setErrorEnabled(false);
}
}
@Override
public void afterTextChanged(Editable editable) {
int length = editable.length();
// text is being removed
if (beforeTextChangedLength > length) return;
String str = editable.toString();
String[] strArr = str.split(Utils.DASH_STRING);
// only add dash after input year with zero dash and input month with one dash
if ((length == YEAR_LENGTH && strArr.length == 1) || (length == YEAR_MONTH_LENGTH && strArr.length == 2)) {
mBirthdayEditText.setText(str + Utils.DASH_STRING);
mBirthdayEditText.setSelection(mBirthdayEditText.length());
}
}
});
}
protected boolean isAllFieldsValid() {
String birthday = mBirthdayEditText.getText().toString().trim();
if (!Utils.isValidBirthday(birthday)) {
mBirthdayTextInputLayout.setError(getString(R.string.error_birth_date));
return false;
}
return true;
}
activity_main.xml
<android.support.design.widget.TextInputLayout
android:id="@+id/register_birthday_textinput_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:errorTextAppearance="@style/ErrorTextInputLayout"
>
<android.support.design.widget.TextInputEditText
android:id="@+id/register_birthday_edittext"
android:hint="@string/birth_date"
android:backgroundTint="@color/white_12"
android:inputType="date"
style="@style/BaseEditText"
android:digits="1234567890"
android:maxLength="10"
/>
</android.support.design.widget.TextInputLayout>
这并不完美,因为我们不应该使用 try catch 来检查验证,并且用户在输入时必须查看日期格式,但如果您想避免使用默认日期选择器,这很简单方便。