应项目需要需要一个出生年月输入框,没错是输入框不是选择框,因为可能不止一个地方需要填写出生日期,用选择框会更慢,所以用填写的,需求是年输入4位直接跳到月输入框,月输入两位跳转到日输入框,日最多可输入两位。
首先是布局其实就是LinearLayout水平布局中EditText+TextView,这里就写个年的,反正日月也差不多,只是最多输出字段由4改成了2
<EditText
android:id="@+id/et_birthYear"
android:layout_width="@dimen/image_90"
android:layout_height="wrap_content"
android:gravity="center"
android:inputType="date"
android:maxLength="4"
android:textColor="@color/gray_txt_color"
android:textSize="16sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="5dp"
android:text="年 "
android:textColor="@color/black_222"
android:textSize="16sp" />
在java文件中监听EditText 当输入了4位后把输入光标移到 月输入框里面。
holder.et_birthYear.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String year = holder.et_birthYear.getText().toString().trim();
if (year.length() == 4) {
this.year = year;
Utils.openEditText(holder.et_birthMonth);
}
}
});
openEditText()方法就是把光标移到对应的EditText里的方法,等下放
再就是月的:
holder.et_birthMonth.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String month =s.toString();
if (month.length() == 1) {//只输入了一位数,如果==1就继续输入,如果大于1前面直接补0
if(Integer.valueOf(month)>1) {
month = "0" + month;
holder.et_birthMonth.setText(month);
AddInsuranManAdapter.this.month = month;
Utils.openEditText(holder.et_birthDay);
}
} else if (month.length() == 2) {
if (Float.valueOf(month) > 12) {
month = "12";
holder.et_birthMonth.setText(month);
}
AddInsuranManAdapter.this.month = month;
Utils.openEditText(holder.et_birthDay);
} else if (month.length() == 0) {
Utils.deleteEditText(holder.et_birthYear);
}
}
});
这里逻辑有判断,如果我只输入了一位字符,如果这个字符等于1的话可以继续输入,如果大于1,就不让输入了直接前面补0,光标跳到日输入框中,还有个删除的操作,如果月输入框中长度为0了,则光标跳转到年输入框中最右边方便删除。
接下来是日输入框操作:
holder.et_birthDay.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String day =s.toString();
if (day.length() == 0) {
Utils.deleteEditText(holder.et_birthMonth);
} else if (day.length() == 2) {
if (TextUtils.isEmpty(year)) {
Utils.openEditText(holder.et_birthYear);
return;
}
if (TextUtils.isEmpty(month)) {
Utils.openEditText(holder.et_birthMonth);
return;
}
Calendar c = Calendar.getInstance();
c.set(Integer.valueOf(year), Integer.valueOf(month), 1);
c.add(Calendar.DATE, -1);
int d = c.get(Calendar.DATE);
if (Integer.valueOf(day) > d) {
day = d + "";
holder.et_birthDay.setText(day);
}
AddInsuranManAdapter.this.day = day;
}
}
});
这里有个逻辑就是输入日输入框输入了两个字段如果这个字段大于当前年月的最大日就默认是当前年月的最大一日,当然如果删除到0了光标也会跳到月输入框中。
光标跳转到其他输入框中的方法:
/**
* 打开软键盘将光标取来
* @param editText
*/
public static void openEditText(EditText editText){
editText.setFocusable(true);
editText.setSelection(0);
editText.requestFocus();
InputMethodManager imm= (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText,InputMethodManager.SHOW_FORCED);
}