Bonjour, je suis un débutant en programmation Android.
J'essaie de créer une activité qui inclut un champ edittext
et un button
. Lorsque l'utilisateur saisit un entier, le bouton le mènera à l'activité suivante. Cependant, je ne le fais pas s'il existe un moyen de vérifier le type de saisie de l'utilisateur.
Est-ce que quelqu'un peut m'aider? Merci beaucoup!
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");
}
Depuis le niveau 1 de l'API, Android fournit une méthode d'assistance pour faire exactement cela (pas besoin d'utiliser regex ou catching exception): TextUtils.isDigitsOnly (CharSequence str)
boolean digitsOnly = TextUtils.isDigitsOnly(editText.getText());
Notez que cette méthode retourne true avec une chaîne vide: Issue 24965
Si vous voulez qu'EditText n'accepte que des chiffres, vous ne pouvez pas spécifier Android:inputType="number"
dans le fichier de présentation.
Vous pouvez utiliser TextWatcher
pour EditText
pour obtenir la valeur de chaque modification de EditText
.Vous devez ajouter une interface à TextWatcher dans votre activité.
mEditText.addTextChangedListener(Your Class Name.this);
on dans la méthode de 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+)?");
}
Essayez cette solution.
Vous devez ajouter les propriétés Android:nextFocusDown="@+id/nextedittext_id"
et Android:singleLine="true"
dans vos éditions.
Par exemple:
<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" />
Et ajoutez le code suivant dans votre activité:
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) {
}
});
la méthode isNumeric est la même que ci-dessus:
public static boolean isNumeric(String str)
{
return str.matches("-?\\d+(.\\d+)?");
}
Le code suivant peut être utilisé pour déterminer les chiffres,
boolean isDigits = TextUtils.isDigitsOnly(edtDigits.getText().toString());
Cependant, puisque cette méthode retourne true avec String vide, vous pouvez donc valider la chaîne vide comme suit:
public boolean isDigits(String number){
if(!TextUtils.isEmpty(number)){
return TextUtils.isDigitsOnly(number);
}else{
return false;
}
}
J'ai trouvé une solution beaucoup plus propre, qui vérifie si la chaîne est un type de nombre comprenant integer
, float
, long
ou double
.
import Java.math.BigDecimal;
Boolean isNumber;
try {
BigDecimal n = new BigDecimal(theStingToCheck);
isNumber = true;
} catch (Exception e) {
isNumber = false;
}