【问题标题】:How do I restrict my EditText input to numerical (possibly decimal and signed) input?如何将我的 EditText 输入限制为数字(可能是十进制和有符号)输入?
【发布时间】:2011-10-18 15:52:24
【问题描述】:

我已阅读 Android: Limiting EditText to numbersHow do I show the number keyboard on an EditText in android?。不幸的是,它们似乎都不符合我的需求。

我想将我的 EditText 输入限制为仅限数字。但是,我也希望允许有符号和/或十进制输入。

这是我当前的代码(我需要以编程方式执行此操作):

EditText edit = new EditText(this);

edit.setHorizontallyScrolling(true);
edit.setInputType(InputType.TYPE_CLASS_NUMBER);

有了这个,我的 EditText 愉快地将所有输入限制为数字。不幸的是,它不允许任何其他内容,例如小数点。

如果我将该行更改为 edit.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL),EditText 将接受所有输入(这不是我想要的......)。

我尝试过组合标志(绝望地想看看它是否可行):

edit.setInputType(InputType.TYPE_CLASS_NUMBER);
edit.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL)
edit.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED)

这也不起作用(EditText 像往常一样接受所有输入)。

那么,我该怎么做呢?

【问题讨论】:

  • 以编程方式?所以你会反对 XML 布局解决方案?
  • 我不会反对,只要我可以即时创建 EditText。

标签: android android-edittext


【解决方案1】:

没有理由使用setRawInputType(),只需使用setInputType()。但是,您必须将类和标志与 OR 运算符结合起来:

edit.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_NUMBER_FLAG_SIGNED);

【讨论】:

  • 如果您同时显示 xml 代码来设置这些标志,将会提高。
  • 这还不够。您仍然可以键入多个小数。这不是一个有效的数字。
  • 有时,Android 会让我拔掉头发。为什么如此简单的事情如此困难且容易出错?
  • 该死的尝试了所有事情......现在我想知道在单个或静态动态编辑文本中它可以与简单的一个语句输入类型一起使用,而使用多个动态 et(et 在数组中)我不必来这里救援..谢谢男人
  • 请注意,如果您不想允许负值,则不需要签名标志
【解决方案2】:

尝试使用TextView.setRawInputType(),它对应android:inputType属性。

【讨论】:

  • 我将如何调用它?我只是调用链中的调用吗?
  • 使用您的示例代码:edit.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
  • 嘿,没关系,我刚刚选择了与 android 输入类型关联的设置器。我很高兴你找到了它,我很接近。是的,它只是一个带有标志的掩码,不是所有的,但很多都是。
  • 解决方案是什么?使用其中任何一个,我仍然会得到我不想要的键,例如“*”、“#”和 parentesis 等……我只想要数字和 -/+/。字符,如何做到这一点?
  • 查看InputType Reference了解更多详情。
【解决方案3】:

使用这个。工作正常

input.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_NUMBER_FLAG_SIGNED);
input.setKeyListener(DigitsKeyListener.getInstance("0123456789"));

编辑

kotlin 版本

fun EditText.onlyNumbers() {
    inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL or
        InputType.TYPE_NUMBER_FLAG_SIGNED
    keyListener = DigitsKeyListener.getInstance("0123456789")
}

【讨论】:

  • 这就是我想要的,谢谢
  • 我可以知道如何只允许他们输入 11 个数字吗? @V.Kalyuzhnyu
  • @LeonZaii 只允许输入“1”并检查字符串长度是否可以被 2 整除
【解决方案4】:

将此行放入xml

 android:inputType="number|numberDecimal"

【讨论】:

  • 我仍然可以输入42.5..5。然后Double.parseDouble() 就可以了...
【解决方案5】:

以编程方式执行此操作的最佳方法是使用下一个方法:

public static DigitsKeyListener getInstance (boolean sign, boolean decimal) 

返回一个接受数字 0 到 9 的 DigitsKeyListener,加上减号(仅在开头)和/或小数点(每个字段仅一个)(如果指定)。

这解决了很多'.'的问题在编辑文本中

editText.setKeyListener(DigitsKeyListener.getInstance(true,true)); // decimals and positive/negative numbers. 

editText.setKeyListener(DigitsKeyListener.getInstance(false,true)); // positive decimals numbers. 

editText.setKeyListener(DigitsKeyListener.getInstance(false,false)); // positive integer numbers.

editText.setKeyListener(DigitsKeyListener.getInstance(true,false)); // positive/negative integer numbers.

【讨论】:

  • 不错!我什至不能复制和粘贴坏字符! (是的,我知道如何在 Android 上复制和粘贴;)
  • 现在我需要做的就是提醒用户如果他们输入了0,这仍然是被禁止的......
【解决方案6】:

大家好,我也有这个问题。我将 C# 与 Xamarin 一起使用

只是一个小小的说明,我希望其他人也是如此。

我已经尝试了这里提到的多种方法。

edittext1.SetRawInputType(Android.Text.InputTypes.ClassNumber | Android.Text.InputTypes.NumberFlagDecimal);

是最接近的,但仍然无法正常工作。正如 Ralf 提到的,您可以使用

edit.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_NUMBER_FLAG_SIGNED);

但是在我的 C# 中我没有这个。相反,您可以按以下方式进行:

edittext1.InputType = Android.Text.InputTypes.ClassNumber | Android.Text.InputTypes.NumberFlagDecimal;

请注意,这些的顺序很重要。如果你把小数放在第一位,它仍然允许你输入任何字符,如果数字是第一位的,它只是数字,但允许小数分隔符!

【讨论】:

  • 非编程我只用android:inputType="numberDecimal"管理这个
【解决方案7】:
EditText edit = new EditText(this);

edit.setHorizontallyScrolling(true);
edit.setInputType(EditorInfo.TYPE_NUMBER_FLAG_SIGNED|EditorInfo.TYPE_CLASS_NUMBER);

【讨论】:

    【解决方案8】:

    要将 EditText 的输入类型设置为十进制,请使用以下代码:

    EditText edit = new EditText(this);
    edit.SetRawInputType(Android.Text.InputTypes.NumberFlagDecimal | Android.Text.InputTypes.ClassNumber);
    

    【讨论】:

      【解决方案9】:

      尝试在您的编辑文本的 xml 中包含此内容:

      android:inputType="numberDecimal"
      

      【讨论】:

        【解决方案10】:

        我的解决方案:`

           public void onTextChanged(CharSequence s, int start, int before, int count) {
           char ch=s.charAt(start + count - 1);
           if (Character.isLetter(ch)) {
               s=s.subSequence(start, count-1);
               edittext.setText(s);
            }
        

        【讨论】:

          【解决方案11】:

          使用 setRawInputTypesetKeyListener

          editTextNumberPicker.setRawInputType(InputType.TYPE_CLASS_NUMBER | 
                             InputType.TYPE_NUMBER_FLAG_DECIMAL|InputType.TYPE_NUMBER_FLAG_SIGNED );
          editTextNumberPicker.setKeyListener(DigitsKeyListener.getInstance(false,true));//set decimals and positive numbers. 
          

          【讨论】:

            最近更新 更多