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 的回答。
创建一个包含多个 EditText
s 和 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)
然后对所有EditText
s 执行以下操作:
currEdit.addTextChangedListener(
YourTextWatcher(prevEdit, currEdit, nextEdit) yourMethodToValidateText() )
而不是 prevEdit、currEdit、nextEdit 设置您的EditText
控件。例如,对于第一个:
edit1.addTextChangedListener(
YourTextWatcher(null, edit1, edit2) yourMethodToValidateText() )
yourMethodToValidateText() 是一种检查输入符号的方法。例如,您可以检查是否所有EditText
s 都已填满。
当您尝试在空的EditText
中按 BackSpace 时,此解决方案存在错误。什么都没有发生,你不会去以前的EditText
。您可以在 View.OnKeyListener 中捕获 BackSpace,但它可以与 TextWatcher 相交。另外,我在将文本复制并粘贴到 EditText
时没有检查情况,忘记检查在 EditText
中选择文本并按 Delete 时会发生什么。
【讨论】:
以上是关于android EditText maxLength 允许用户输入更多的主要内容,如果未能解决你的问题,请参考以下文章
Android从零单排系列七《Android视图控件——EditText》
Android从零单排系列七《Android视图控件——EditText》