android EditText maxLength允许用户输入更多

时间:2014-09-17 21:06:53

标签: android android-widget

我已经在xml布局文件中为EditText小部件设置了maxLength属性,但它确实限制了字符的显示。

但它仍然允许用户按下键盘上的更多字母,并且退格会删除这些额外的按下而不是显示屏上的最后一个字母。

我相信这不是它应该是的样子。达到限制后按键应该停止接受更多输入,即使它没有显示。

对此有何解决方法?

更新

根据以下答案,对于多行EditText,也要添加textMultiLine属性。

android:inputType="textFilter|textMultiLine"

4 个答案:

答案 0 :(得分:10)

  1. 停用自动建议(android:inputType="textFilter"textNoSuggestions):
  2. 设置maxLength

    <EditText
       android:id="@+id/editText"
       android:inputType="textFilter"
       android:maxLength="8"
       android:layout_width="match_parent"
       android:layout_height="wrap_content" />
    
  3. 我希望,这有帮助

答案 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答案。

创建一个包含多个EditTextandroid: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,忘记检查会发生什么情况。