android EditText maxLength 允许用户输入更多

Posted

技术标签:

【中文标题】android EditText maxLength 允许用户输入更多【英文标题】:android EditText maxLength allows user to type more 【发布时间】:2014-11-12 01:35:06 【问题描述】:

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

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

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

有什么解决办法吗?

更新

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

android:inputType="textFilter|textMultiLine"

【问题讨论】:

您是否获得了有关此问题的信息,为什么会发生以及其他应用程序(例如 Whatsapp)如何处理此问题? 我刚刚输入了同样的问题,*** 向我推荐了你的问题。好消息是,当您从 EditText 获取值时,您只会得到可见字符,无论在限制之后输入了多少。不好的是退格会影响用户体验。 【参考方案1】:
    禁用自动建议(android:inputType="textFilter"textNoSuggestions):

    设置最大长度

    <EditText
       android:id="@+id/editText"
       android:inputType="textFilter"
       android:maxLength="8"
       android:layout_
       android:layout_ />
    

希望对你有帮助

【讨论】:

完全相同的行为,如果输入以字母开头。 =( @LuciusHipan 请检查更新版本。我想,我明白了。 你做到了!冠军!谢谢!你会在 22 小时内得到我的赏金,由于某种原因我现在不能奖励它 我确认这行得通。哇!严重地。但无论如何,对于迟到的 cmets 感到抱歉。很忙,几周没有检查过***网站。所以,我会接受这个答案,非常感谢!【参考方案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());
            
        );
    

【讨论】:

抱歉,它什么也没做,现在尝试。首先, Editable s 在其 maxLength 之后没有得到任何值。问题至少在键盘缓冲区的某个地方向下一级。尝试在 afterTextChanged 中记录每个输入,你会看到 我使用数字作为测试用例的输入。当我只输入数字时,它可以工作,例如1234567890。但是,如果我混合其他字符,例如abcde12345 我得到了与您观察到的相同的错误行为。所以是的,问题似乎更深层次。抱歉,我没有更正确地测试我的答案。 天啊,好收获!如果输入以数字开头,无论发生什么,它都会按预期工作,但如果它以字母字符开头 - 这是一个错误【参考方案3】:

您可以使用InputFilter

InputFilters 可以附加到 Editables 以限制更改 可以给他们做的。

Xml

    <EditText
   android:id="@+id/edit_Text"
   android:layout_
   android:layout_ />

Java 类

int maxLengthofYourEditText = 5;    // Set Your Limit 
edit_TextObj.setFilters(new InputFilter[] new InputFilter.LengthFilter(maxLengthofYourEditText));

【讨论】:

@KonstaninLoginov 昨天提出了这个建议,但这不起作用(如果输入以字母开头) @LuciusHipan 看看这里***.com/questions/30774123/… maxLength 正在工作。问题是,如果用户在 maxLength 之后继续输入字符,它们是不可见的,但它们到达某种软件键盘缓冲区,然后当用户按下退格键时,它会删除那些不可见的字符,这会影响用户体验。解决方案在下面的答案中。不幸的是,我不是这个问题的作者,所以我不能接受它 @EvgeniyMishustin,请使用解决方案的链接。如果有超过 3 个答案,我们就找不到可行的解决方案。 :) 我认为你的意思是 jmeinke solition。【参考方案4】:

当有一系列包含 1 个符号(通常的 pin 码)的字段时,我也遇到了这种情况。

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

创建一个包含多个 EditTexts 和 android:maxLength="2" 的布局(我们将在其中输入一个符号并跳转到另一个 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) 
    

然后对所有EditTexts 执行以下操作:

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

而不是 prevEdit、currEdit、nextEdit 设置您的EditText 控件。例如,对于第一个:

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

yourMethodToValidateText() 是一种检查输入符号的方法。例如,您可以检查是否所有EditTexts 都已填满。

当您尝试在空的EditText 中按 BackSpace 时,此解决方案存在错误。什么都没有发生,你不会去以前的EditText。您可以在 View.OnKeyListener 中捕获 BackSpace,但它可以与 TextWatcher 相交。另外,我在将文本复制并粘贴到 EditText 时没有检查情况,忘记检查在 EditText 中选择文本并按 Delete 时会发生什么。

【讨论】:

以上是关于android EditText maxLength 允许用户输入更多的主要内容,如果未能解决你的问题,请参考以下文章

Android从零单排系列七《Android视图控件——EditText》

Android从零单排系列七《Android视图控件——EditText》

Android从零单排系列七《Android视图控件——EditText》

android EditText inputType说明

android editText 监听事件

Android EditText 操作。。。