在Android中限制EditText文本长度的最佳方法是什么?

有没有通过xml实现这一点的方法?


当前回答

我看到了很多好的解决方案,但我想给出一个我认为更完整、更人性化的解决方案:

1、限制长度。2、如果输入更多,则发出回调以触发吐司。3、光标可以在中间或尾部。4、用户可以通过粘贴字符串进行输入。5、始终丢弃溢出输入并保留原点。

public class LimitTextWatcher implements TextWatcher {

    public interface IF_callback{
        void callback(int left);
    }

    public IF_callback if_callback;

    EditText editText;
    int maxLength;

    int cursorPositionLast;
    String textLast;
    boolean bypass;

    public LimitTextWatcher(EditText editText, int maxLength, IF_callback if_callback) {

        this.editText = editText;
        this.maxLength = maxLength;
        this.if_callback = if_callback;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        if (bypass) {

            bypass = false;

        } else {

            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(s);
            textLast = stringBuilder.toString();

            this.cursorPositionLast = editText.getSelectionStart();
        }
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        if (s.toString().length() > maxLength) {

            int left = maxLength - s.toString().length();

            bypass = true;
            s.clear();

            bypass = true;
            s.append(textLast);

            editText.setSelection(this.cursorPositionLast);

            if (if_callback != null) {
                if_callback.callback(left);
            }
        }

    }

}


edit_text.addTextChangedListener(new LimitTextWatcher(edit_text, MAX_LENGTH, new LimitTextWatcher.IF_callback() {
    @Override
    public void callback(int left) {
        if(left <= 0) {
            Toast.makeText(MainActivity.this, "input is full", Toast.LENGTH_SHORT).show();
        }
    }
}));

我没能做到的是,如果用户高亮显示当前输入的一部分并试图粘贴一个很长的字符串,我不知道如何恢复高亮显示。

例如,最大长度设置为10,用户输入“12345678”,并将“345”标记为突出显示,然后尝试粘贴一个超过限制的字符串“0000”。

当我尝试使用edit_text.setSelection(start=2,end=4)恢复原点状态时,结果是,它只插入2个空格作为“12 345 678”,而不是原点高亮显示。我希望有人解决这个问题。

其他回答

xml中的简单方式:

android:maxLength="4"

如果您需要在xml编辑文本中设置4个字符,请使用

<EditText
    android:id="@+id/edtUserCode"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLength="4"
    android:hint="Enter user code" />

对于已经使用自定义输入筛选器并希望限制最大长度的用户,请注意:

当您在代码中分配输入过滤器时,所有先前设置的输入过滤器都将被清除,包括一个使用android:maxLength设置的过滤器。我在尝试使用自定义输入筛选器以防止在密码字段中使用某些不允许的字符时发现了这一点。使用setFilters设置过滤器后,不再观察到maxLength。解决方案是以编程方式将maxLength和自定义过滤器设置在一起。类似于:

myEditText.setFilters(new InputFilter[] {
        new PasswordCharFilter(), new InputFilter.LengthFilter(20)
});

XML

android:maxLength=“10”

编程方式:

int maxLength = 10;
InputFilter[] filters = new InputFilter[1];
filters[0] = new InputFilter.LengthFilter(maxLength);
yourEditText.setFilters(filters);

注意:在内部,EditText和TextView解析XML中android:maxLength的值,并使用InputFilter.LengthFilter()应用它。

参见:TextView.java#L1564

TextView tv = new TextView(this);
tv.setFilters(new InputFilter[]{ new InputFilter.LengthFilter(250) });

以编程方式为Java尝试以下操作:

myEditText(new InputFilter[] {new InputFilter.LengthFilter(CUSTOM_MAX_LEN)});