我有一定要求让Android中的EditText
占用一个月和一年(所以我给出的提示为mm / yy)。当用户强制输入2个月的数字时,应该可以看到/
,比如说(11 /),然后是年份。
以下是我在editext
上使用的代码。但是,当我按下移动键盘上的十字按钮时,它不会删除/
,但会删除输入的月份。有人可以告诉我为什么会出现这种情况?
ed.addTextChangedListener(new TextWatcher(){
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,int after) {
}
@Override
public void afterTextChanged(Editable s) {
if(ed.getText().toString().matches("[0-9]") && ed.getText().toString().length()==2) {
month=ed.getText().toString();
ed.setText(month+"/");
}
}
});
答案 0 :(得分:2)
对于您想要实现的目标,请尝试以下我测试过它
将这两行添加到xml
中的edittext中android:maxLength="7"
android:inputType="number"
在您的活动中添加以下内容
public int pos=0; //declare this as global variable
ed=(EditText)findViewById(R.id.editText1);
ed.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
if(ed.getText().length()==2 && pos!=3)
{ ed.setText(ed.getText().toString()+"/");
ed.setSelection(3);
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
pos=ed.getText().length();
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
此处编辑文字只会输入数字和长度不超过7,当输入第二个数字/附加到
时pos变量 当你在位置3,即在/后面按下后退键时,位置为2,所以它再次附加/避免这个pos记录文本改变之前的位置,所以当你按回键之前的前一个位置为3时它不会追加/导致删除/
答案 1 :(得分:0)
除了更改文本外,您可能还需要在控件中移动选择位置。
答案 2 :(得分:0)
尝试以下代码。它将为您工作!!
在xml文件中:
<EditText
android:id="@+id/mDateEntryField"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:inputType="date"
android:maxLength="5"
android:hint="Exp. MM/YY"/>
在Java文件中:
mDateEntryField.addTextChangedListener(mDateEntryWatcher);
private TextWatcher mDateEntryWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String working = s.toString();
boolean isValid = true;
mDateEntryField.setError(null);
if (working.length() == 2 && before == 0) {
if (Integer.parseInt(working) < 1 || Integer.parseInt(working) > 12) {
isValid = false;
} else {
working += "/";
mDateEntryField.setText(working);
mDateEntryField.setSelection(working.length());
}
} else if (working.length() == 5 && before == 0) {
String enteredYear = working.substring(3);
DateFormat df = new SimpleDateFormat("yy"); // Just the year, with 2 digits
String formattedDate = df.format(Calendar.getInstance().getTime());
int currentYear = Integer.parseInt(formattedDate);
if (Integer.parseInt(enteredYear) < currentYear) {
isValid = false;
}
} else if (working.length() != 5) {
isValid = false;
} else
isValid = true;
if (!isValid) {
mDateEntryField.setError("Enter a valid date: MM/YY");
} else {
mDateEntryField.setError(null);
}
}
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
};