我已经在xml布局文件中为EditText小部件设置了maxLength属性,但它确实限制了字符的显示。
但它仍然允许用户按下键盘上的更多字母,并且退格会删除这些额外的按下而不是显示屏上的最后一个字母。
我相信这不是它应该是的样子。达到限制后按键应该停止接受更多输入,即使它没有显示。
对此有何解决方法?
更新
根据以下答案,对于多行EditText,也要添加textMultiLine属性。
android:inputType="textFilter|textMultiLine"
答案 0 :(得分:10)
android:inputType="textFilter"
或textNoSuggestions
):设置maxLength
<EditText
android:id="@+id/editText"
android:inputType="textFilter"
android:maxLength="8"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
我希望,这有帮助
答案 1 :(得分:2)
不幸的是,以下答案无效。但是,如果输入以数字开头,它帮助我们发现Poly Bug提到的错误是不可重现的。
您可以使用TextWatcher
收听EditText
更改,并阻止用户在字段中输入太多字符。以下代码适用于我:
final int maxLength = 10;
EditText editText = (EditText) findViewById(R.id.my_edittext_id);
editText.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) {
if (s.length() >= maxLength) s.delete(maxLength, s.length());
}
});
在afterTextChanged
中,代码将插入文本的长度与最大长度maxLength
进行比较,并删除所有多余的字符。
您可以使用以下类替换所有标准EditText
类,以将侦听器与maxLength
XML属性结合使用:
public class MyMaxLengthEditText extends EditText {
public static final String XML_NAMESPACE_ANDROID = "http://schemas.android.com/apk/res/android";
private final int mMaxLength;
public MyMaxLengthEditText(Context context) {
super(context, null);
mMaxLength = -1;
}
public MyMaxLengthEditText(Context context, AttributeSet attrs) {
super(context, attrs);
mMaxLength = attrs.getAttributeIntValue(XML_NAMESPACE_ANDROID, "maxLength", -1);
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) {
if (s.length() >= mMaxLength) s.delete(mMaxLength, s.length());
}
});
}
}
答案 2 :(得分:1)
您可以使用 InputFilter
可以将InputFilters附加到Editables以约束更改 可以对他们做出。
<强> XML 强>
<EditText
android:id="@+id/edit_Text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
Java类
int maxLengthofYourEditText = 5; // Set Your Limit
edit_TextObj.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLengthofYourEditText)});
答案 3 :(得分:0)
当具有一系列包含1个符号(通常的密码)的字段时,我也遇到了这种情况。
我的解决方案基于@jmeinke答案。
创建一个包含多个EditText
和android:maxLength="2"
的布局(我们将在其中的任何一个中输入1个符号,然后跳转到另一个EditText
。很奇怪,但是在某些手机上,下面的代码有效即使对于maxLength = 1)。
class YourTextWatcher(
private val prevEdit: EditText?,
private val currEdit: EditText,
private val nextEdit: EditText?,
private val method: () -> Unit
) : TextWatcher {
override fun afterTextChanged(s: Editable?) {
if (s.isNullOrEmpty()) {
prevEdit?.requestFocus()
} else {
if (s.length > 1) {
if (currEdit.selectionEnd > 1) {
// If stand on second position of EditText and enter new symbol,
// will move to next EditText copying second symbol.
val secondSymbol = s.substring(1, 2)
nextEdit?.setText(secondSymbol)
}
// Remove second symbol.
s.delete(1, s.length)
}
nextEdit?.requestFocus()
nextEdit?.setSelection(nextEdit.length(), nextEdit.length())
method()
}
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
}
然后对所有EditText
执行以下操作:
currEdit.addTextChangedListener(
YourTextWatcher(prevEdit, currEdit, nextEdit) { yourMethodToValidateText() })
设置EditText
控件代替prevEdit,currEdit和nextEdit。例如,对于第一个:
edit1.addTextChangedListener(
YourTextWatcher(null, edit1, edit2) { yourMethodToValidateText() })
yourMethodToValidateText()是一种将检查输入符号的方法。例如,您可以检查是否所有EditText
都已填充。
当您尝试在空白的EditText
中按BackSpace时,此解决方案存在一个错误。没有任何反应,您将不会上一个EditText
。您可以在View.OnKeyListener中捕获BackSpace,但它可以与TextWatcher相交。另外,当在EditText
中选择文本并按Delete键时,我没有检查将文本复制并粘贴到EditText
,忘记检查会发生什么情况。