机器人的EditText最大长度允许用户键入更多

问题描述 投票:14回答:4

我已经设定在XML布局文件一个EditText插件的最大长度属性,它确实限制字符的显示。

但它仍然允许用户按键盘上的字母,和退格删除这些额外的印刷机,而不是屏幕上的最后一个字母。

我相信这不是它是如何应该是。按下按键后,已经达到极限应停止接受即使不显示它更多的投入。

任何解决这个?

更新

基于下面的答案,用于多的EditText,添加textMultiLine属性了。

android:inputType="textFilter|textMultiLine"
android android-widget
4个回答
11
投票
  1. 禁用自动建议(android:inputType="textFilter"textNoSuggestions):
  2. 设置最大长度 <EditText android:id="@+id/editText" android:inputType="textFilter" android:maxLength="8" android:layout_width="match_parent" android:layout_height="wrap_content" />

我希望,它有助于


2
投票

不幸的是,以下的答案无效。然而,它帮助我们发现,保利的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());
            }
        });
    }
}

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)});

0
投票

我还碰上这种情况发生了一系列含有1个符号(通常的销码)字段时。

我的解决方案是基于@jmeinke答案。

创建一个包含几个EditTexts与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) {
    }
}

那么对于所有EditTexts做到以下几点:

currEdit.addTextChangedListener(
    YourTextWatcher(prevEdit, currEdit, nextEdit) { yourMethodToValidateText() })

取而代之的prevEdit,currEdit,nextEdit设置你的EditText控制。例如,对于第一:

edit1.addTextChangedListener(
    YourTextWatcher(null, edit1, edit2) { yourMethodToValidateText() })

yourMethodToValidateText()是将检查输入符号的方法。例如,您可以检查是否所有EditTexts被填充。

该解决方案有一个bug,当你尝试按退格空EditText。什么也没有发生,你不会去到以前的EditText。您可以在View.OnKeyListener赶退格,但它可以与TextWatcher相交。此外,我没有检查的情况时,复制和粘贴文本EditText,忘了检查,会发生什么情况,选择当EditText并按文本删除。

© www.soinside.com 2019 - 2024. All rights reserved.