Android 中限制 EditText 文本长度的最佳方法是什么
在 Android 中限制 EditText
文本长度的最佳方法是什么?
有没有办法通过 xml 来做到这一点?
What's the best way to limit the text length of an EditText
in Android?
Is there a way to do this via xml?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(22)
我遇到了这个问题,我认为我们缺少一种解释清楚的方法来以编程方式执行此操作,而不会丢失已设置的过滤器。
在 XML 中设置长度:
正如接受的答案正确指出的那样,如果您想为 EditText 定义一个固定长度,并且以后不再更改,只需在您的 EditText XML 中定义:
以编程方式设置长度
要以编程方式设置长度,您需要通过
InputFilter
进行设置。但是,如果您创建一个新的InputFilter 并将其设置为EditText
,您将丢失所有其他已定义的过滤器(例如maxLines、inputType 等),您可能已通过XML 或以编程方式添加了这些过滤器。所以这是错误:
为了避免丢失以前添加的过滤器,您需要获取这些过滤器,添加新过滤器(在本例中为 maxLength),然后将过滤器设置回
EditText
如下:Java
Kotlin 然而,这对每个人来说都更容易,您还需要将过滤器添加到现有的过滤器中,但您可以通过简单的方法来实现:
I have had this problem and I consider we are missing a well explained way of doing this programmatically without losing the already set filters.
Setting the length in XML:
As the accepted answer states correctly, if you want to define a fixed length to an EditText which you won't change further in the future just define in your EditText XML:
Setting the length programmatically
To set the length programmatically you'll need to set it through an
InputFilter
. But if you create a new InputFilter and set it to theEditText
you will lose all the other already defined filters (e.g. maxLines, inputType, etc) which you might have added either through XML or programatically.So this is WRONG:
To avoid losing previously added filters you need to get those filters, add the new one (maxLength in this case), and set the filters back to the
EditText
as follow:Java
Kotlin however made it easier for everyone, you also need to add the filter to the already existing ones but you can achieve that with a simple:
对于已经使用自定义输入过滤器并且想要限制最大长度的用户请注意:
当您在代码中分配输入过滤器时,所有先前设置的输入过滤器都将被清除,包括一组带有
的输入过滤器android:maxLength
。当我尝试使用自定义输入过滤器来防止使用密码字段中不允许的某些字符时,我发现了这一点。使用 setFilters 设置该过滤器后,不再观察到 maxLength。解决方案是以编程方式将 maxLength 和我的自定义过滤器设置在一起。像这样的事情:A note to people who are already using a custom input filter and also want to limit the max length:
When you assign input filters in code all previously set input filters are cleared, including one set with
android:maxLength
. I found this out when attempting to use a custom input filter to prevent the use of some characters that we don't allow in a password field. After setting that filter with setFilters the maxLength was no longer observed. The solution was to set maxLength and my custom filter together programmatically. Something like this:对于其他想知道如何实现此目的的人,这里是我的扩展
EditText
类EditTextNumeric
。.setMaxLength(int)
- 设置最大位数.setMaxValue(int)
- 限制最大整数值.setMin(int)
- 限制最小值整数值.getValue()
- 获取整数值用法示例:
适用于
EditText
的所有其他方法和属性当然也可以工作。For anyone else wondering how to achieve this, here is my extended
EditText
classEditTextNumeric
..setMaxLength(int)
- sets maximum number of digits.setMaxValue(int)
- limit maximum integer value.setMin(int)
- limit minimum integer value.getValue()
- get integer valueExample usage:
All other methods and attributes that apply to
EditText
, of course work too.Xml
Java:
Kotlin:
Xml
Java:
Kotlin:
根据 goto10 的观察,我将以下代码放在一起,以防止通过设置最大长度丢失其他过滤器:
Due to goto10's observation, I put together the following code to protected against loosing other filters with setting the max length:
实现此目的的另一种方法是将以下定义添加到 XML 文件中:
这会将
EditText
小部件的最大长度限制为 6 个字符。Another way you can achieve this is by adding the following definition to the XML file:
This will limit the maximum length of the
EditText
widget to 6 characters.XML
android:maxLength="10"
以编程方式:
注意:在内部,EditText & TextView 解析 XML 中
android:maxLength
的值,并使用InputFilter.LengthFilter()
来应用它。请参阅: TextView.java#L1564
XML
android:maxLength="10"
Programmatically:
Note: internally, EditText & TextView parse the value of
android:maxLength
in XML and useInputFilter.LengthFilter()
to apply it.See: TextView.java#L1564
从 material.io 中,您可以将
TextInputEditText
与TextInputLayout
结合使用:您可以使用drawable配置密码EditText:
或者您可以使用/不使用计数器来限制文本长度:
依赖项:
From material.io, you can use
TextInputEditText
combined withTextInputLayout
:You can configure a password EditText with drawable:
Or you can limit text length with/without a counter:
Dependency:
Kotlin:
ZTE Blade A520
有奇怪的效果。当您键入超过 10 个符号(例如 15 个)时,EditText
将显示前 10 个,但其他 5 个不可见且不可访问。但是,当您使用Backspace
删除符号时,它首先删除正确的 5 个符号,然后删除剩余的 10 个。要克服此行为,请使用或者这个:
或者这个,如果你想得到建议:
Kotlin:
ZTE Blade A520
has strange effect. When you type more than 10 symbols (for instance, 15),EditText
shows first 10, but other 5 are not visible and not accessible. But when you delete symbols withBackspace
, it first deletes right 5 symbols and then removes remaining 10. To overcome this behaviour use a solution:or this:
or this, if you want to have suggestions:
这是一个自定义的 EditText 类,允许长度过滤器与其他过滤器一起使用。
感谢 Tim Gallagher 的回答(如下)
This is a custom EditText Class that allow Length filter to live along with other filters.
Thanks to Tim Gallagher's Answer (below)
xml 中的简单方法:
如果您需要在 xml 编辑文本中设置 4 个字符,请使用此
it simple way in xml:
if u require to set 4 character in xml edit-text so,use this
以编程方式在 Java 上尝试一下:
Try this for Java programmatically:
xml 中的简单方法:
要以编程方式设置它,您可以使用以下函数
it simple way in xml:
for setting it programmatically you can use the following function
这工作正常...
android:maxLength="10"
这将只接受
10
个字符。This works fine...
android:maxLength="10"
this will accept only
10
characters.我正在使用“maxLength”,但它对我不起作用。因此,根据我的经验,我尝试了一些事情。
我发现了问题。
我必须声明id。
然后:
I was using "maxLength" but it didn't work for me. So, based on my experience, I tried a few things.
And I detected the problem.
I must declare the id.
Then:
我看到了很多好的解决方案,但我想给出一个我认为更完整且用户友好的解决方案,其中包括:
1、限制长度。
2, 如果输入更多,则回调以触发您的吐司。
3、光标可以在中间或尾部。
4、用户可以通过粘贴字符串的方式输入。
5、始终丢弃溢出输入并保留原点。
我失败的是,如果用户突出显示当前输入的一部分并尝试粘贴很长的字符串,我不知道如何恢复突出显示。
例如,最大长度设置为10,用户输入“12345678”,并将“345”标记为突出显示,并尝试粘贴超出限制的字符串“0000”。
当我尝试使用 edit_text.setSelection(start=2, end=4) 恢复原始状态时,结果是,它只是插入 2 个空格作为“12 345 678”,而不是原始突出显示。我希望有人能解决这个问题。
I had saw a lot of good solutions, but I'd like to give a what I think as more complete and user-friendly solution, which include:
1, Limit length.
2, If input more, give a callback to trigger your toast.
3, Cursor can be at middle or tail.
4, User can input by paste a string.
5, Always discard overflow input and keep origin.
What I failed to do is, if user highlight a part of the current input and try to paste an very long string, I don't know how to restore the highlight.
Such as, max length is set to 10, user inputed '12345678', and mark '345' as highlight, and try to paste a string of '0000' which will exceed limitation.
When I try to use edit_text.setSelection(start=2, end=4) to restore origin status, the result is, it just insert 2 space as '12 345 678', not the origin highlight. I'd like someone solve that.
您可以在EditText中使用
android:maxLength="10"
。(这里限制最多10个字符)You can use
android:maxLength="10"
in the EditText.(Here the limit is upto 10 characters)文档
示例
Documentation
Example
使用输入过滤器来限制文本视图的最大长度。
use an input filter to limit the max length of a text view.