也许这已经回答了,但我在 SO 上找不到。
我有一个非常简单的需求:限制 EditText 中字符的长度。
为此,我在 xml 中使用了 maxLength
标签。
奇怪的是,如果输入的文本长度超过了规定的长度,通过软键盘按退格键无法删除文本。输入的文本保留在 EditText 字段中。关闭并重新打开软键盘后,文本变为“可删除”。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLength="5"
android:hint="text"/>
</RelativeLayout>
添加此布局足以获得所描述的行为。
我添加了一个 InputFilter 来查看这里发生了什么。如果没有 InputFilter,所描述的结果将是相同的!
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText et = (EditText) findViewById(R.id.edit);
InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source,
int start,
int end,
Spanned dest,
int dstart,
int dend) {
if (source != null) {
Log.v("edit","source = " + source.toString());
Log.v("edit","start = " + start);
Log.v("edit","end = " + end);
}
if (dest != null) {
Log.v("edit","dest= " + dest.toString());
Log.v("edit","dstart = " + dstart);
Log.v("edit","dend = " + dend);
}
return null;
}
};
InputFilter[] oldFilters = et.getFilters();
InputFilter[] newFilters = new InputFilter[oldFilters.length + 1];
System.arraycopy(oldFilters, 0, newFilters, 0, oldFilters.length);
newFilters[oldFilters.length] = filter;
et.setFilters(newFilters);
}
在记录时我可以看到,如果超过 maxLength
,source
将保持不变,但 Spanned dest
会改变它的方式应该,通过按退格键删除文本字符。
现在这里发生了什么?这是错误还是真的是默认行为。因为如果用户键入他的文本并且超出限制,他将没有机会进行更正。
编辑:
Sandeep Kumar 建议的使用 Java 代码设置 maxLength 的方法会导致相同的结果。
et.setFilters(new InputFilter[]{new InputFilter.LengthFilter(5)});
顺便说一句,我使用的是 Android API 4.4.2 和 SDK 23.0.2。
最佳答案
对我有用的是如下使用 Length restricting textwatcher 并使用 textNoSuggestions 作为 inputType
public class LengthTextWatcher implements TextWatcher {
String prevVal = "";
int length;
public LengthTextWatcher(int l) {
length = l;
}
@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 != null && s.length() > 0) {
if(s.length() > length) {
s.clear();
s.insert(0, prevVal);
}
prevVal = s.toString();
}
}
}
...
应用textWatcher的示例方法
mFirstNameET.addTextChangedListener(new LengthTextWatcher(35));
和
android:inputType="textNoSuggestions"
关于java - EditText 中的 maxLength 属性无法通过 xml 和 java 正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25948982/