Как определить, является ли вход в EditText целым числом?
Привет, я новичок в Android-программировании.
Я пытаюсь создать активность, которая включает в себя поле edittext
и button
. Когда пользователь вводит целое число, кнопка приведет их к следующему действию. Однако я не знаю, есть ли способ проверить тип ввода пользователя.
Кто-нибудь может мне помочь? Большое вам спасибо!
Ответы
Ответ 1
Обновить:
Вы можете контролировать EditText, чтобы принимать только цифры
<TextView
.
.
.
android:inputType="number"
/>
или проверить это программно
В котлине
val number = editText123.text.toString().toIntOrNull()
val isInteger = number != null
На яве
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
Начиная с уровня API 1, Android предоставляет вспомогательный метод для этого (нет необходимости использовать регулярное выражение или исключение catching): TextUtils.isDigitsOnly(CharSequence str)
boolean digitsOnly = TextUtils.isDigitsOnly(editText.getText());
Обратите внимание, что этот метод возвращает true с пустой строкой: Проблема 24965
Ответ 3
Если вы хотите, чтобы EditText принимал только номера, которые вы не можете указать android:inputType="number"
в файле макета.
Ответ 4
Вы можете использовать TextWatcher
для EditText
, чтобы получить значение каждого изменения в EditText
. Вам нужно добавить интерфейс TextWatcher в свою активность.
mEditText.addTextChangedListener(Your Class Name.this);
on в методе 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+)?");
}
Ответ 5
Попробуйте это решение.
Вам нужно добавить свойства 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+)?");
}
Ответ 6
Я нашел намного более чистое решение, которое проверяет, является ли строка любым типом числа, включая integer
, float
, long
или double
.
import java.math.BigDecimal;
Boolean isNumber;
try {
BigDecimal n = new BigDecimal(theStingToCheck);
isNumber = true;
} catch (Exception e) {
isNumber = false;
}
Ответ 7
Следующий код может использоваться для определения цифр,
boolean isDigits = TextUtils.isDigitsOnly(edtDigits.getText().toString());
Однако, поскольку этот метод также возвращает true с пустой строкой, вы можете поместить проверку для пустой строки следующим образом:
public boolean isDigits(String number){
if(!TextUtils.isEmpty(number)){
return TextUtils.isDigitsOnly(number);
}else{
return false;
}
}