24

嗨,我是 Android 编程的新手。

我正在尝试构建一个包含edittext字段和button. 当用户输入一个整数时,按钮将引导他们进入下一个活动。但是,如果有办法检查用户输入的类型,我不会。

任何人都可以帮助我吗?非常感谢!</p>

4

7 回答 7

52

从 API 级别 1 开始,Android 提供了一个辅助方法来做到这一点(无需使用正则表达式或捕获异常):TextUtils.isDigitsOnly(CharSequence str)

boolean digitsOnly = TextUtils.isDigitsOnly(editText.getText());

请注意,此方法返回true且字符串为空:问题 24965

于 2013-11-26T12:36:39.477 回答
38

更新:

您可以控制 EditText 只接受数字

<TextView 
.
.
.
android:inputType="number"
/>

或以编程方式检查

在科特林

val number = editText123.text.toString().toIntOrNull() 
val isInteger = number != null

在 Java 中

String text = editText123.getText().toString();
try {
   int num = Integer.parseInt(text);
   Log.i("",num+" is a number");
} catch (NumberFormatException e) {
   Log.i("",text+" is not a number");
}
于 2012-04-12T08:53:15.437 回答
10

如果您希望 EditText 只接受您无法android:inputType="number"在布局文件中指定的数字。

于 2012-04-12T09:34:27.677 回答
4

您可以使用TextWatcherforEditText获取每次更改的值。EditText您需要在 Activity 中添加 TextWatcher 的接口。

 mEditText.addTextChangedListener(Your Class Name.this);

在 TextWatcher 的方法中

     @Override
public void afterTextChanged(Editable s) {
    Log.v("Log_tag", "After TextChanged" + s.toString());

}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
        int after) {
    Log.i("Log_tag", "Before TextChanged" + s.toString());

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    Log.e("Log_tag", "ontext Changed" + s.toString());
    //you can match here s with number or integer 
             if(isNumeric( s.toString())){
                      //it is number     
               }
    }


 public static boolean isNumeric(String str)
 {
    return str.matches("-?\\d+(.\\d+)?");
  }
于 2012-04-12T08:53:41.160 回答
4

以下代码可用于确定数字,

boolean isDigits = TextUtils.isDigitsOnly(edtDigits.getText().toString());

但是,由于此方法也使用空字符串返回 true,因此您可以对空字符串进行验证,如下所示,

public boolean isDigits(String number){ 
   if(!TextUtils.isEmpty(number)){
       return TextUtils.isDigitsOnly(number);
   }else{
       return false;
   }
}
于 2017-11-27T18:10:25.663 回答
1

试试这个解决方案。

您需要添加属性 android:nextFocusDown="@+id/nextedittext_id"android:singleLine="true"在您的编辑文本中。

例如:

<EditText
        android:id="@+id/ed1"
        android:layout_width="200dp"
        android:nextFocusDown="@+id/ed2"
         android:singleLine="true"
        android:layout_height="wrap_content" />


 <EditText
        android:id="@+id/ed2"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:layout_below="@+id/ed1" />

并在您的活动中添加以下代码:

 editText1.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                String value=s.toString();
                    if(isNumeric(value)){
                        if(Integer.parseInt(value)>=100){
                            editText1.setFocusableInTouchMode(true);
                            editText1.setFocusable(false);
                        }
                }
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });
        editText2.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                editText1.setFocusableInTouchMode(true);
                editText1.setFocusable(true);
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

isNumeric 方法同上:

 public static boolean isNumeric(String str)
    {
        return str.matches("-?\\d+(.\\d+)?");
    }
于 2016-07-14T12:39:35.090 回答
1

我找到了一个更简洁的解决方案,它检查字符串是否是任何类型的数字,包括integer,或. floatlongdouble

import java.math.BigDecimal;

Boolean isNumber;

try {
    BigDecimal n = new BigDecimal(theStingToCheck);
    isNumber = true;
} catch (Exception e) {
    isNumber = false;
}
于 2016-10-17T21:48:20.223 回答