我试过通过TextWatcher
的afterTextChanged
。如果用户在达到限制后尝试插入字符,我想要的只是在EditText
上显示toast消息或设置错误。我认为这是可能的。但不知道如何实现这一目标。
我的EditText编码是
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:maxLength="10"
android:layout_marginTop="150dp"
android:inputType="numberDecimal" >
在这里,如果用户试图输入超过10位数,我想显示一个吐司或想要设置错误。
editText1.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (editText1.getText().length() >= 10)
Toast.makeText(getApplicationContext(), "hi",
Toast.LENGTH_SHORT).show();
return false;
}
});
你可以用editText
得到你的this的maxLength。然后实现一个keyListener。
int maxLength = //getMaxLenght here;
editText.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(editText.getText().toString().length()>= maxLength) {
//Show toast here
}
return false;
}
});
关键监听器无法在软输入键盘上工作..来自Android参考:
http://developer.android.com/reference/android/view/View.OnKeyListener.html
View.OnKeyListener
类概述将硬件键事件调度到此视图时要调用的回调的接口定义。在将键事件提供给视图之前将调用回调。这仅适用于硬件键盘;软件输入方法没有义务触发此监听器。
这意味着TextWatcher只是你的朋友,有编辑框和键盘输入..
假设您知道EditText的最大长度,您可以像这样使用EditText.setError(String errorMsg)
:
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (charSequence.toString().length() >= maxLength) {
// show toast / error here
String limitReached = "Maximum limit of characters reached!";
editText.setError(limitReached);
} else {
// clear error
editText.setError(null);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
它看起来像这样。当EditText未处于焦点时,不显示错误消息,但错误图标保持可见。您可以使用EditText.getError()
检查EditText上当前是否存在错误。
这可能比你要求的要多,但如果你有一个带有动态字符限制的EditText,我建议在maxLength
变量的某个地方挂一个值。 (例如,支付卡的安全代码因卡类型而异)
但是,您可以执行以下操作以编程方式检查android:maxLength
当前设置的XML值:
private int getEditTextCharacterLimit(EditText editText) {
int defaultMaxLength = 5; // default value
InputFilter[] filters = editText.getFilters();
if (filters != null && filters[0] != null && filters[0] instanceof InputFilter.LengthFilter) {
return ((InputFilter.LengthFilter) filters[0]).getMax();
} else {
return defaultMaxLength;
}
}
Here's how you would dynamically change the EditText's character limit programmatically.
这可能比您要求的要多,但是如果您有一个具有动态字符限制的EditText,我建议在maxLength变量的某处挂起该值。 (例如,支付卡的安全代码因卡类型而异)