如何使 EditText
接受输入格式:
4digit 4digit 4digit 4digit
我试过Custom format edit text input android to accept credit card number,但遗憾的是我无法删除这些空格 . 只要有空间,我就无法删除它 . 请帮我找出问题所在 .
如何使 EditText
接受输入格式:
4digit 4digit 4digit 4digit
我试过Custom format edit text input android to accept credit card number,但遗憾的是我无法删除这些空格 . 只要有空间,我就无法删除它 . 请帮我找出问题所在 .
20 回答
找到多个'OK'的答案后 . 我走向了一个更好的TextWatcher,它可以正确地独立于
TextView
工作 .TextWatcher类如下:
然后将其添加到TextView中,就像其他任何
TextWatcher
一样 .这将自动删除合理返回的空间,以便用户在编辑时实际上可以做更少的击键 .
警告
如果您使用
inputType="numberDigit"
,这将禁用'-'和' '字符,因此我建议使用inputType="phone"
. 这可以启用其他字符,但只需使用自定义输入过滤器并解决问题 .这是我的解决方案 . 我的评论应该足以让Android开发人员了解正在发生的事情,但如果您有任何问题,请随时提出,我会尽我所能回答 .
这是一个使用正则表达式的清洁解决方案虽然正则表达式效率低,但在这种情况下它们就足够了,因为它处理的字符串最多为19个字符,即使每次按键后都进行处理 .
我认为我的解决方案可以很好地适用于中间文本操作或复制粘贴操作 .
请参阅下面的代码,
使inputType为EditText的数字,以避免布局文件中的其他字符 .
希望对你有所帮助 .
上述答案都不适合我 . 我创建了一个解决start-string / end-string / mid-string问题的方法 . 复制和粘贴也应该正常工作 . 这支持Mastercard,Visa和Amex . 您可以更改分隔符 . 如果您不需要付款方式类型,请将其删除 . 不过是Kotlin . 这个想法很简单 . 每次文本更改时我都会删除所有分隔符并根据格式重新添加它们 . 解决了start-string / mid-string问题 . 那么唯一的问题是你需要在添加分隔符后计算出正确的文本位置 .
我修改了Chris Jenkins的答案,使其更加强大 . 这样,即使用户编辑文本的中间部分,间距字符仍然会正确插入(并在错误的位置自动删除) .
要使其正常工作,请确保
EditText
属性设置如下(请注意digits
上的空格):那么这就是你需要的
TextWatcher
. 匿名类也可以是静态的,因为它独立于EditText
.你可能已经弄明白了,但这就是我所做的 . 我必须覆盖的唯一方法是AfterTextChanged .
检查信用卡的格式是否已经有效,基本情况以防止无限递归
如果表单无效,请删除所有空格,然后复制到另一个字符串中,在适当的位置插入空格 .
然后只需用新字符串替换editable即可 .
如果您需要特定步骤的代码,请随时询问 .
而Preethi,你无法删除空格的原因是因为你无法在onTextChanged回调中更改文本 . 来自开发者网站:
public abstract void onTextChanged(CharSequence s,int start,int before,int count)在API级别1中添加
调用此方法通知您,在s中,从start开始的计数字符刚刚替换了之前具有长度的旧文本 . 尝试从此回调中更改s是错误的 .
不确定 TextWatcher 是否正确使用 - 我们应该使用 InputFilter
根据Android文档,TextWatcher应该用于外部使用示例:一个[EditView]用于密码输入 + 一个[TextView]视图,显示"weak","strong"等...
对于 Credit Card Format 我正在使用 InputFilter :
并结合长度过滤器(Android SDK):
这可以在输入和删除数字时处理这种情况 .
(!)但是这不能处理整个字符串的复制/粘贴的情况,这个应该在不同的InputFilter类中完成
希望能帮助到你 !
即使用户编辑了mid-string,此实现也可确保正确放置间距字符 . 还支持显示在软键盘上的其他字符(例如破折号);也就是说,用户无法输入它们 . 可以进行一项改进:此实现不允许删除字符串中间的字符 .
适用于适当的
PasswordTransformationMethod
实现以屏蔽CC数字 .经过大量搜索而没有得到满意的答案来满足我的需求后,我最终编写了自己的功能 .
以下是根据输入的卡类型格式化输入的信用卡详细信息的示例 . 目前,它负责格式化Visa,MasterCard和American Express .
除格式化空格外,我还应用检查以确保卡号不超过其最大限制,并且当达到最大限制时,通过执行字体更改,用户会收到通知他已输入所有数字的通知 . 这是执行上述操作的功能 .
}
注意:Constants.java中的声明如下:
希望能帮助到你!
在你的布局中:
这里
TextWachter
在16号信用卡中每4位数设置一个空格 .我正在将我的解决方案添加到列表中 . 据我所知,它没有任何缺点;您可以在中间编辑,删除间距字符,复制并粘贴到其中等 .
为了允许在字符串中的任何位置进行编辑,并保持光标位置,遍历Editable并逐个取出所有空格(如果有的话) . 然后在适当的位置添加新的空格 . 这将确保光标随着对内容的更改而移动 .
这个解决方案是针对IBAN实现的,但原理是一样的,我试着纠正上面答案中的所有主要问题,如果你发现错误随意说出来,谢谢 .
设置EditText并限制可以使用的字符:
这是TextWatcher:
这是一个使用所有函数来做出决定的示例 . 代码可能会更长一点,但它会更快,因为它主要使用给定值的函数(start,before,count ...) . 此示例每4位数添加“ - ”,并在用户使用退格时删除它们 . 同时,确保光标在最后 .
}
这是一个使用
TextWatcher
类的简单且易于定制的解决方案 . 可以使用addTextChangedListener()
方法将其分配给EditText
.或者,这是一个基于epool's实现的更清晰的实现 .
Example on github.com
迟到的答案,但我想这可能对某人有帮助:
这与start-string / end-string / mid-string编辑完美配合,也可以完美粘贴 .
请看project . Android表单编辑文本是EditText的扩展,它将数据验证工具带到edittext
我刚刚完成了下一个实现并且对我很有用,即使在
EditText
的任何位置粘贴和键入新文本也是如此 .Gist file
Usage:
editText.addTextChangedListener(new CreditCardFormattingTextWatcher());