Je construis une petite application Android dans laquelle l'utilisateur entre une adresse IP ou un nom d'hôte dans un widget EditText. 90% du temps, ils entreront une adresse IP, le reste du temps - un nom d'hôte.
Je souhaite donc naturellement optimiser pour leur faciliter la saisie d'une adresse IP, mais il est important de pouvoir basculer vers le mode alphanumérique.
Je n'arrive pas à trouver un bon inputType. La numberDecimal
semblait initialement être un bon coup, mais elle ne permet qu’un point.
Idéalement, j'aimerais commencer avec un clavier standard sur lequel le bouton ?123
est enfoncé.
Comment puis-je y arriver?
Essayez d’utiliser Android:inputType="number"
, mais définissez également Android:digits="0123456789."
. Travaille pour moi.
Si vous utilisez inputType="phone"
, vous avez accès à un clavier découpé contenant des chiffres et un caractère de période - cela ne limite pas l'entrée en ce qui concerne le nombre de périodes que vous pouvez entrer.
Veuillez consulter cette réponse pour validation lors de la saisie.
Cela fonctionne parfaitement clavier avec des nombres et des décimales en ajoutant Android: inputType = "number | numberDecimal" et Android: digits = "0123456789."
Exemple
<EditText
Android:id="@+id/ip_address"
Android:inputType="number|numberDecimal"
Android:digits="0123456789."
Android:layout_width="match_parent"
Android:layout_height="wrap_content"/>
Vous pouvez utiliser votre propre filtre d'entrée pour cela
final EditText text = new EditText(ServerSettings.this);
InputFilter[] filters = new InputFilter[1];
filters[0] = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start,
int end, Spanned dest, int dstart, int dend) {
if (end > start) {
String destTxt = dest.toString();
String resultingTxt = destTxt.substring(0, dstart) +
source.subSequence(start, end) +
destTxt.substring(dend);
if (!resultingTxt.matches ("^\\d{1,3}(\\." +
"(\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3})?)?)?)?)?)?")) {
return "";
} else {
String[] splits = resultingTxt.split("\\.");
for (int i=0; i<splits.length; i++) {
if (Integer.valueOf(splits[i]) > 255) {
return "";
}
}
}
}
return null;
}
};
text.setFilters(filters);
utilisez ceci :
<EditText
Android:id="@+id/txtIP"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:digits="0123456789."
/>
<EditText
Android:id="@+id/ip_address"
Android:inputType="number|numberDecimal"
Android:digits="0123456789."
Android:layout_width="match_parent"
Android:layout_height="wrap_content"/>
a travaillé pour moi
Vous pouvez étendre DigitsKeyListener ( source ) et modifier la fonction filter () (validation qui vérifie le modèle IP ou un nom d’hôte de chaîne) et getInputType () en return InputType.TYPE_CLASS_PHONE;
Je pense que votre seule option est ..
EditText Android:inputType="text" ... />
Vous pouvez éventuellement vérifier le texte pour 3 points qu'une adresse IP contient
Je pense que vous devez utiliser TextWatcher pour la validation, enregistrez-le avec TextView.addTextChangedListener () et utilisez Pattern.DOMAIN_NAME et Pattern.IP_ADDRESS (Android 2.2+).
Voir:
Android: Comment valider la saisie EditText?
Validation de l’IP sous Android
Peut-être que si vous utilisez 2 radiobutton, l'un montre un edittext pour Host, l'autre montre 4 edittext numérique pour IP, puis, une fois que l'utilisateur a envoyé des données, concatemez les 4 valeurs edittext avec des points, comme ceci, edittext1.getText ( ) + "." + edittext2.getText () + "." edittext3.getText () + "." edittext4.getText () afin que vous puissiez obtenir une adresse IP validée de la sorte, mais cela impliquera évidemment plus de travail.
Essayez d'utiliser Android:inputType="textUri"
. Cela fonctionne particulièrement bien lorsque vous voulez un nom d’hôte ou une adresse IP.