如何在Android上将EditText键盘设置为仅包含数字?

85

我希望我的 EditText 显示一个只有数字可见,没有其他字符的键盘。

我已经尝试了所有可用的输入方式,但都没有成功。我搜索了一种获取仅包含数字键的键盘的方法,但我只看到了以下参考:

android: inputType = "numberPassword"

但是我希望数字可见,就像这样:(numberPassword)

输入图像描述在此

我已尝试过:

android:digits="0123456789"
android:inputType="phone"

android:inputType="number"
但它看起来像这样:

enter image description here


1
请查看以下链接:https://dev59.com/ll3Ua4cB1Zd3GeqP-Tag#8122968 - MysticMagicϡ
请查看此链接 https://dev59.com/unDXa4cB1Zd3GeqP9S64#54866377 - ucMedia
@ucMedia,你下面的回答是正确的。 - Jorge B.
14个回答

142

尝试了几次,我终于做到了!我是通过编程来设置键盘值的,代码如下:

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());

这是我现在键盘的样子:


14
两年后我得到了正确答案,恭喜 :) - Jorge B.
4
这是我发现的唯一有效的解决方案。谢谢! - Greg Brown
2
令人惊叹的答案! - Matan Dahan
无论我传递什么给 setTransformationMethod 方法,键盘处于全屏模式时仍然显示项目符号。 - Stan Mots
3
在Kotlin中,如果您不想要符号,请只需编写:myEditText .transformationMethod = null。 - Stack Diego
显示剩余5条评论

29

android:inputType="number" 或者 android:inputType="phone"。保留这些内容。你将得到一个包含数字的键盘。有关不同类型键盘的更多详细信息,请查看此链接

我认为只有通过创建自己的软键盘才可能实现。或尝试使用 android:inputType="number|textVisiblePassword"。但它仍然显示其他字符。另外,您可以保留android:digits="0123456789"仅允许输入数字到您的edittext中。或者如果您仍想获得与图像相同的效果,则尝试使用 | 分隔符组合两个或更多功能,并检查您的运气,但据我所知,您必须创建自己的键盘才能确切地获得这样的效果。


1
无法工作,出现字符:“。”“-”“”,我想要一个类似键盘的图像。 - Jorge B.
1
我认为只有创建自己的软键盘才可能实现。或者尝试android:inputType="number|textVisiblePassword"。但它仍然显示其他字符。此外,您可以保留android:digits="0123456789"以允许在edittext中仅输入数字。或者,如果您仍然想要与图像相同的效果,请尝试使用|分隔符组合两个或更多功能,并检查您的运气,但据我所知,您必须创建自己的键盘才能完全实现这一点。 - Kanth
1
@perfectionming,实际上你也可以在Java代码中以编程方式设置此功能,例如:editText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL); 或者您想要的任何输入类型,只需使用常量即可。有关更多常量值,请参阅我的答案中的上面链接。如果有帮助,请不要忘记点赞我的答案;)或者您甚至可以通过xml代码膨胀布局以获取自定义对话框,然后在xml代码本身中设置这些输入特性。 - Kanth
1
@perfectionming,我认为它不会显示要输入的字母,因为它纯粹基于API。让我检查一下,否则你可以向我展示你当前场景的图像或代码。 - Kanth
1
@perfectionming,即使在自定义对话框中,只要我通过Java代码保留输入功能,它就可以在我的端上工作。 - Kanth
显示剩余2条评论

12
如果您使用Kotlin:
XML
android:inputType="numberPassword"

代码

editText.transformationMethod = null

结果:

输入图像描述


9
<EditText
        android:id="@+id/editText3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:ems="10"
        android:inputType="number" />

我已经尝试过很多方法,现在尝试这种方式。它会显示其他字符,但你无法在EditText中输入。

edit.setRawInputType(Configuration.KEYBOARD_12KEY);

enter image description here


谢谢你的帮助,但是那种方法并不能解决我的问题。我已经尝试过了。我需要数字键盘。而且你的例子显示了其他字符。我正在尝试各种方法,但这并不容易。 :( - Jorge B.
显然与问题无关,但你从哪里获取了那个主题? - Kayla

5
如果您想只显示数字而不带字符,请将以下代码行放入您的XML文件中:android:inputType="number"。输出如下: enter image description here 如果您想要显示一个同时还带有字符的数字键盘,请在您的XML上加上android:inputType="phone"。输出结果(包含字符)如下: with characters 如果您想显示一个与密码一样掩蔽输入的数字键盘,请将android:inputType="numberPassword"放入您的XML中。输出如下: enter image description here 对于只发布屏幕截图链接,我真的很抱歉。我想研究一下如何真正地在这里发布图片,但可能会耗费我的时间,所以就这样吧。我希望我的帖子能帮助其他人。是的,我的答案与其他回答重复,但为了节省其他人运行代码前看到输出所需的时间,我的帖子可以为您节省一些时间。

你好!欢迎来到SO。请查看正确答案 - Jorge B.
1
OP特别想排除,*#,但这个答案包括了那些字符。 - Josh Correia

3

可能有点晚了,但它可能会帮助其他人。

您可以为您的EditText设置keylistener,并仅传递要侦听的键:

yourEditText.keyListener = DigitsKeyListener.getInstance("0123456789")

3

完全没有必要实现新的转换方法。只需使用以下方法即可简单解决:

XML

android:inputType="numberPassword"

代码

textField.transformationMethod = null

仍然无法正常工作 - 在 API 31 上仍然接受逗号、点等(取决于本地化和键盘)。 - Fedir Tsapana
@FedirTsapana 我非常怀疑这一点。我已经在最新的API和各种设备和API上测试了这种方法。它只允许输入0-9。此外,它还显示了DELETE键和ENTER键。 - themenace

3

我认为你已经以某种方式正确地在键盘上显示了数字,因此最好尝试在EditText中使用给定的XML代码,它将完美地工作,所以这里是代码 -

  android:inputType="number"

如果有任何疑问,您可以再次向我提问,我将尽力彻底解决您的问题。谢谢。

谢谢,但不起作用,出现字符:“。”“-”“”“” 请查看问题中的图像。 - Jorge B.
1
是的,Jorge,请等一下,我正在尝试制作一个只显示数字而不显示任何特殊字符的键盘。 - Ravi
为什么不在程序中检查验证,以确定用户输入的是数字还是特殊字符,如果输入的是数字,则继续进行,否则不进行。 - Ravi
因为我正在开发的应用程序规范只允许使用数字键盘,不能输入其他字符。 如果不是这个规范,我早就解决了这个问题... 我一直在尝试并在谷歌和这里寻找答案... :( - Jorge B.
1
我正在尝试,如果成功了,我会让你知道。 - Ravi
如果我的editText出现在对话框中,因此我只在.java代码中声明它,即对话框editText不出现在XML文件中。我该如何实现这一点? - Sibbs Gambling

1
如果您想要在Jetpack Compose中使用此内容:
TextField(
     value = textState,
     onValueChange = { text ->
         textState = text
     },
     keyboardOptions = KeyboardOptions.Default.copy(
         keyboardType = KeyboardType.NumberPassword
     ),
     visualTransformation = VisualTransformation.None
)

1
在XML中使用这个:
android:inputType="numberPassword"

然后在代码中使用这个。
mobileET.setTransformationMethod(HideReturnsTransformationMethod.getInstance());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接