我如何将我的EditText输入限制为数字(可能是十进制和带符号)输入?

我已阅读Android:将EditText限制为数字,以及如何在android的EditText上显示数字键盘? 不幸的是,它们似乎都不符合我的需求。

我想将我的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照常接受所有输入)。

那么,我该怎么做呢?

kibibyte asked 2020-01-14T14:55:57Z
10个解决方案
162 votes

没有必要使用setRawInputType(),而仅使用setInputType()。但是,您必须将类和标志与OR运算符结合使用:

edit.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_NUMBER_FLAG_SIGNED);
Ralf answered 2020-01-14T14:56:40Z
61 votes

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

Dan S answered 2020-01-14T14:56:18Z
12 votes

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

public static DigitsKeyListener getInstance (boolean sign, boolean decimal) 

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

这样就解决了很多“。”的问题。 在EditText中

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.
SerSánGal answered 2020-01-14T14:57:10Z
12 votes

用这个。 工作良好

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

编辑

科特林版本

fun EditText.onlyNumbers() {
    inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL or
        InputType.TYPE_NUMBER_FLAG_SIGNED
    keyListener = DigitsKeyListener.getInstance("0123456789")
}
Vlad answered 2020-01-14T14:57:38Z
10 votes

将此行放在xml

 android:inputType="number|numberDecimal"
Qutbuddin Bohra answered 2020-01-14T14:57:58Z
4 votes

大家好我也有这个问题。 我在Xamarin中使用C#

请注意,我也希望其他人也可以。

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

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;

请注意,这些的顺序很重要。 如果将Decimal放在前面,它仍然允许您键入任何字符,如果Number是第一个字符,则只能是数字,但允许使用十进制分隔符!

Marius Van Wyk answered 2020-01-14T14:58:45Z
2 votes
EditText edit = new EditText(this);

edit.setHorizontallyScrolling(true);
edit.setInputType(EditorInfo.TYPE_NUMBER_FLAG_SIGNED|EditorInfo.TYPE_CLASS_NUMBER);
Yasin Hassanien answered 2020-01-14T14:59:01Z
1 votes

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

EditText edit = new EditText(this);
edit.SetRawInputType(Android.Text.InputTypes.NumberFlagDecimal | Android.Text.InputTypes.ClassNumber);
fulgen answered 2020-01-14T14:59:21Z
0 votes

我的解决方案:

   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);
    }
Meh yit answered 2020-01-14T14:59:42Z
0 votes

使用setRawInputType和setKeyListener

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. 
Hossein Hajizadeh answered 2020-01-14T15:00:01Z
translate from https://stackoverflow.com:/questions/6919360/how-do-i-restrict-my-edittext-input-to-numerical-possibly-decimal-and-signed-i