【问题标题】:How do you set the EditText keyboard to only consist of numbers on Android?您如何将 EditText 键盘设置为仅包含 Android 上的数字?
【发布时间】:2012-11-28 20:16:05
【问题描述】:

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

我已经测试了所有可用的输入,但它不起作用。我搜索了一种方法来获得只有数字的键盘,但我只看到了以下参考:

android: inputType = "numberPassword"

但我希望数字可见,如下所示:(numberPassword)

我试过了:

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

android:inputType="number"

但它看起来像这样:

【问题讨论】:

标签: android android-layout android-edittext


【解决方案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_width="wrap_content"
        android:layout_height="wrap_content"
        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("\\p{So}+".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】:

        将以下几行放入您的&lt;EditText&gt;

        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 不想隐藏键盘。
        猜你喜欢
        • 2011-06-06
        • 1970-01-01
        • 2017-04-22
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 2021-05-07
        • 2020-07-09
        相关资源
        最近更新 更多