java - EditText 中的 maxLength 属性无法通过 xml 和 java 正常工作

标签 java android xml android-edittext android-input-filter

也许这已经回答了,但我在 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);
}

在记录时我可以看到,如果超过 maxLengthsource 将保持不变,但 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/

相关文章:

java - 如何使用 XdmNode 从标签读取 namespace ?

java - Windows 命令输出 (Java)

java - 当我使用 Java 8 Stream.of 原始类型时,结果很困惑

java - 在 case 条件下使用 char 的 switch 语句?

Java如何控制GIF动画?

java - 日期选择器对话框。设置无效日期时如何重新打开它

java - android和javafx轻量级兼容事件框架

android - 错误 : Could not Resolve Package Name in Flutter

xml - 使用 JAXB 使用 XmlElement 和 XmlAttributes 解析和 XML

c# - XMLRead.Create(new StringReader) 是否提供读取非 unicode (BIG5) 的功能?