嗨,我是Android编程的新手。
我正在尝试构建包含edittext
字段和button
的活动。当用户输入整数时,该按钮将引导他们进入下一个活动。但是,如果有办法检查用户输入的类型,我不会这样做。
任何人都可以帮助我吗?非常感谢你!
答案 0 :(得分:41)
从API级别1开始,Android提供了一个辅助方法来实现这一点(不需要使用正则表达式或捕获异常):TextUtils.isDigitsOnly(CharSequence str)
boolean digitsOnly = TextUtils.isDigitsOnly(editText.getText());
请注意,此方法返回带有空字符串的 true :Issue 24965
答案 1 :(得分:27)
<强>更新强>
您可以控制EditText只接受数字
<TextView
.
.
.
android:inputType="number"
/>
或以编程方式检查
在Kotlin
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");
}
答案 2 :(得分:10)
如果您希望EditText只接受数字,则无法在布局文件中指定android:inputType="number"
。
答案 3 :(得分:4)
您可以TextWatcher
使用EditText
获取EditText
中每项更改的值。您需要在Activity中添加TextWatcher的界面。
mEditText.addTextChangedListener(Your Class Name.this);
@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+)?");
}
答案 4 :(得分:2)
以下代码可用于确定数字,
boolean isDigits = TextUtils.isDigitsOnly(edtDigits.getText().toString());
但是,由于此方法返回true并且空字符串也是如此,因此您可以按如下方式对空字符串进行验证,
public boolean isDigits(String number){
if(!TextUtils.isEmpty(number)){
return TextUtils.isDigitsOnly(number);
}else{
return false;
}
}
答案 5 :(得分:1)
尝试此解决方案。
您需要添加属性android:nextFocusDown="@+id/nextedittext_id"
和
你的edittexts中有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+)?");
}
答案 6 :(得分:1)
我找到了一个更清洁的解决方案,它会检查字符串是否为任何类型的数字,包括integer
,float
,long
或double
。
import java.math.BigDecimal;
Boolean isNumber;
try {
BigDecimal n = new BigDecimal(theStingToCheck);
isNumber = true;
} catch (Exception e) {
isNumber = false;
}