我已经设定在XML布局文件一个EditText插件的最大长度属性,它确实限制字符的显示。
但它仍然允许用户按键盘上的字母,和退格删除这些额外的印刷机,而不是屏幕上的最后一个字母。
我相信这不是它是如何应该是。按下按键后,已经达到极限应停止接受即使不显示它更多的投入。
任何解决这个?
更新
基于下面的答案,用于多的EditText,添加textMultiLine属性了。
android:inputType="textFilter|textMultiLine"
android:inputType="textFilter"
或textNoSuggestions
):<EditText
android:id="@+id/editText"
android:inputType="textFilter"
android:maxLength="8"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
我希望,它有助于
不幸的是,以下的答案无效。然而,它帮助我们发现,保利的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());
}
});
}
}
您可以使用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)});
我还碰上这种情况发生了一系列含有1个符号(通常的销码)字段时。
我的解决方案是基于@jmeinke答案。
创建一个包含几个EditText
s与android:maxLength="2"
布局(我们将在任何他们进入1个符号,并跳转到另一个EditText
。很奇怪,但在某些手机上下面的代码工作即使是最大长度= 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
s做到以下几点:
currEdit.addTextChangedListener(
YourTextWatcher(prevEdit, currEdit, nextEdit) { yourMethodToValidateText() })
取而代之的prevEdit,currEdit,nextEdit设置你的EditText
控制。例如,对于第一:
edit1.addTextChangedListener(
YourTextWatcher(null, edit1, edit2) { yourMethodToValidateText() })
yourMethodToValidateText()是将检查输入符号的方法。例如,您可以检查是否所有EditText
s被填充。
该解决方案有一个bug,当你尝试按退格空EditText
。什么也没有发生,你不会去到以前的EditText
。您可以在View.OnKeyListener赶退格,但它可以与TextWatcher相交。此外,我没有检查的情况时,复制和粘贴文本EditText
,忘了检查,会发生什么情况,选择当EditText
并按文本删除。