您如何将 EditText 键盘设置为仅包含 Android 上的数字?
Posted
技术标签:
【中文标题】您如何将 EditText 键盘设置为仅包含 Android 上的数字?【英文标题】:How do you set the EditText keyboard to only consist of numbers on Android? 【发布时间】:2012-11-28 20:16:05 【问题描述】:我希望我的EditText
显示一个仅有数字可见的键盘,没有其他字符。
我已经测试了所有可用的输入,但它不起作用。我搜索了一种方法来获得只有数字的键盘,但我只看到了以下参考:
android: inputType = "numberPassword"
但我希望数字可见,如下所示:(numberPassword)
我试过了:
android:digits="0123456789"
android:inputType="phone"
和
android:inputType="number"
但它看起来像这样:
【问题讨论】:
检查***.com/a/8122968/1777090 看看***.com/a/54866377/7756492 @ucMedia 你在下面有正确的答案。 【参考方案1】:经过几次尝试,我明白了! 我像这样以编程方式设置键盘值:
myEditText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
或者,如果您愿意,您可以像这样编辑 XML:
android: inputType = "numberPassword"
两个配置都会显示密码项目符号,所以我们需要创建一个自定义的ClickableSpan
类:
private class NumericKeyBoardTransformationMethod extends PasswordTransformationMethod
@Override
public CharSequence getTransformation(CharSequence source, View view)
return source;
最后我们需要在EditText
上实现它,以便显示输入的字符。
myEditText.setTransformationMethod(new NumericKeyBoardTransformationMethod());
这就是我的键盘现在的样子:
【讨论】:
2年后我得到了正确答案,恭喜:) 这是我发现的唯一可行的解决方案。谢谢! 惊人的答案! 有效,但改变了字体样式,在 Nexus 5X、Android 7.1.1 上测试。 当键盘处于全屏模式时,它仍然显示项目符号。无论我将什么传递给setTransformationMethod
方法。【参考方案2】:
android:inputType="number"
或 android:inputType="phone"
。你可以保留这个。您将获得包含数字的键盘。有关不同类型键盘的更多详细信息,请查看此link。
我认为只有创建自己的软键盘才有可能。或者试试这个android:inputType="number|textVisiblePassword
。但它仍然显示其他字符。此外,您可以保留android:digits="0123456789"
以仅允许您的edittext
中的数字。或者,如果您仍然想要与图片中的相同,请尝试将两个或更多功能与 |分隔符并检查你的运气,但据我所知,你必须创建自己的键盘才能完全一样..
【讨论】:
不起作用,出现字符:“.” “-”,“”,我想要一个像键盘一样的图像。 我认为只有创建自己的软键盘才有可能。或者试试这个 android:inputType="number|textVisiblePassword。但它仍然显示其他字符。此外,您可以保留 android:digits="0123456789" 以在您的编辑文本中只允许数字。或者如果您仍然想要与图像相同,请尝试将两个或多个功能与 | 分隔符结合起来并检查你的运气,但据我所知,你必须创建自己的键盘才能完全一样.. @perfectionming 好吧,实际上您也可以像这样在 java 代码中以编程方式将此功能设置为编辑文本 --> editText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL);或您想要的任何输入类型,您只需借助常量即可。有关更多恒定值,请参阅我的答案中的上述链接。如果有帮助,请不要忘记支持我的答案;)或者您甚至可以通过自定义对话框的 xml 代码扩展布局,然后在 xml 代码本身中设置这些输入功能.. @perfectionming 我认为它不会显示要输入的字母,因为它纯粹基于 api。让我检查并返回,否则您可以向我展示您当前场景的图像或代码。【参考方案3】:<EditText
android:id="@+id/editText3"
android:layout_
android:layout_
android:layout_weight="1"
android:ems="10"
android:inputType="number" />
我已经尝试了所有东西,现在试试这个 它显示其他字符,但您无法在editText中输入
edit.setRawInputType(Configuration.KEYBOARD_12KEY);
【讨论】:
感谢您的帮助,但不要解决我的问题。我已经尝试过这种方式。我需要数字键盘。你的例子展示了另一个人的性格。我正在尝试一切,但这并不容易。 :( 显然与问题无关,但你从哪里得到这个主题?【参考方案4】:我认为你以某种方式使用了正确的方法来仅在键盘上显示数字,所以最好在编辑文本中尝试使用 xml 的给定行,它会完美运行,所以这里的代码是-
android:inputType="number"
如有任何疑问,您可以再次询问我,我会尽力彻底解决您的问题。 谢谢
【讨论】:
谢谢,但不起作用,出现字符:“。” "-" "" 请看问题中的图片。 是的,Jorge 等一下,我正在尝试制作一个只显示数字而不显示任何特殊字符的键盘 为什么不在程序中检查用户是否输入数字或特殊字符的验证,如果他输入数字而不是继续,否则不会 因为我正在做的应用程序的规范仅使用键盘数字,没有其他字符。如果不是规范,我已经解决了这个问题......我一直在尝试并在谷歌和这里寻找...... :( 我正在努力,如果我成功了,我会告诉你的【参考方案5】:如果您只想显示不带字符的数字,请将这行代码放入您的 XML 文件 android:inputType="number"
。输出:
如果您想显示同时显示字符的数字键盘,请将android:inputType="phone"
放在您的 XML 中。输出(带字符):
如果您想显示一个数字键盘,就像密码一样屏蔽您的输入,请输入android:inputType="numberPassword"
。输出:
如果我只发布屏幕截图的链接,我真的很抱歉,我想研究如何在这里真正发布图像,但它可能会占用我的时间,所以就在这里。我希望我的帖子可以帮助其他人。是的,我的答案与此处发布的其他答案重复,但为了节省其他人在看到输出之前可能需要运行代码的时间,我的帖子可能会为您节省一些时间。
【讨论】:
嗨!欢迎来到 SO。请参阅correct answer。 OP 特别想排除,*#
,但这个答案包括那些字符。【参考方案6】:
晚了一点,但它可能会帮助其他人。 您可以为您的 EditText 设置 keylistener 并仅将要侦听的键传递给它:
yourEditText.keyListener = DigitsKeyListener.getInstance("0123456789")
【讨论】:
【参考方案7】:完全没有必要实施新的转换方法。仅此一项就可以很好地解决它:
XML
android:inputType="numberPassword"
代码
textField.transformationMethod = null
【讨论】:
不工作 - 至少在 api 31 上仍然接受逗号、点等(取决于本地化和键盘) @FedirTsapana 我非常怀疑这一点。我已经在最新的 API 以及各种设备和 API 上测试了这种方法。它只允许输入 0-9。此外,它还显示 DELETE 键和 ENTER 键。【参考方案8】:如果你使用 Kotlin:
XML
android:inputType="numberPassword"
代码
editText.transformationMethod = null
结果:
【讨论】:
【参考方案9】:Koltin 解决方案:
我在 Koltin 中做了一个扩展来实现这一点。即使使用过滤器,我也尝试了很多方法,但Filter
存在一些错误,例如在输入时重复相同的文本。
fun EditText.onAfterTextChanged(allowedChars: String, listener: (String) -> Unit)
addTextChangedListener(object : TextWatcher
override fun afterTextChanged(editable: Editable?)
val input = editable.toString()
val newValue = replaceInvalidCharacters(input, allowedChars)
if (newValue != input)
setText(newValue)
setSelection(text.length)
listener(newValue)
override fun beforeTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int)
override fun onTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int)
)
fun replaceInvalidCharacters(value: String, allowedChars: String): String
var finalValue = value.replace("\\pSo+".toRegex(), "") // To remove emojis when copy paste
if (finalValue.isNotEmpty())
val lastChar = finalValue.last()
if (!allowedChars.contains(lastChar, false))
finalValue = finalValue.dropLast(1)
return finalValue
您可以在 Activity 中使用它,如下所示:
editText.onAfterTextChanged(getString(R.string.supported_digits)) // Here you can pass whatever the digits you want to allow
val length = it.length
if (length > 250) // You can also check how much length to allow
return@onAfterTextChanged
您可以将任何您想允许的字符传递给它
它会在输入时过滤表情符号
即使您复制粘贴,它也会删除表情符号
它将只允许出现在 allowedChars 中的字符
适用于所有安卓版本
它将解决使用过滤器重复文本的问题
【讨论】:
【参考方案10】:将以下几行放入您的<EditText>
:
android:digits="0123456789"
android:inputType="phone"
【讨论】:
OP 特别想排除,*#
但这个答案包括这些字符。【参考方案11】:
如果我们指定EditText,
android:inputType="number"
只能得到数字。但如果你使用,
android:inputType="phone"
除了数字之外,它还可以接受特殊字符,例如 ;,/". 等
【讨论】:
OP 特别想排除,*#
但这个答案包括这些字符。【参考方案12】:
在xml中edittext
:
android:id="@+id/text"
在程序中:
EditText text=(EditText) findViewById(R.id.text);
text.setRawInputType(Configuration.KEYBOARDHIDDEN_YES);
【讨论】:
OP 不想隐藏键盘。以上是关于您如何将 EditText 键盘设置为仅包含 Android 上的数字?的主要内容,如果未能解决你的问题,请参考以下文章
如何为特定活动禁用Android Soft Keyboard?