Ich baue eine kleine Android-App, bei der der Benutzer eine IP-Adresse oder einen Hostnamen in ein EditText-Widget eingibt. In 90% der Fälle geben sie eine IP-Adresse ein, während der Rest der Zeit ein Hostname ist.
Ich möchte natürlich optimieren, um es ihnen leicht zu machen, eine IP-Adresse einzugeben, aber die Möglichkeit, für die Eingabe des Hostnamens zu Alpha-Zahlen zu wechseln, ist wichtig.
Ich kann anscheinend keinen guten inputType finden. Die numberDecimal
erschien anfangs wie ein guter Schuss, erlaubt aber nur einen Punkt.
Im Idealfall möchte ich mit einer Standardtastatur beginnen, bei der die ?123
-Taste gedrückt wurde.
Wie komme ich dort hin?
Versuchen Sie es mit Android:inputType="number"
, aber setzen Sie auch Android:digits="0123456789."
. Funktioniert bei mir.
Wenn Sie inputType="phone"
verwenden, erhalten Sie Zugriff auf eine reduzierte Tastatur, die Zahlen und ein Punktzeichen enthält. Dies beschränkt die Eingabe jedoch nicht auf die Anzahl der Perioden, die Sie eingeben können.
Bitte sehen Sie diese Antwort für die Bestätigung während der Eingabe.
Dies funktioniert perfekt Tastatur mit Zahlen und Dezimalzahlen durch Hinzufügen von Android: inputType = "number | numberDecimal" und Android: Ziffern = "0123456789".
Beispiel
<EditText
Android:id="@+id/ip_address"
Android:inputType="number|numberDecimal"
Android:digits="0123456789."
Android:layout_width="match_parent"
Android:layout_height="wrap_content"/>
Sie können dafür einen eigenen Eingabefilter verwenden
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);
benutze das :
<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"/>
arbeitete für mich
Sie können DigitsKeyListener ( source ) erweitern und die filter () - Funktion ändern (Überprüfung, die entweder das IP-Muster oder einen String-Hostnamen überprüft) und getInputType () in return InputType.TYPE_CLASS_PHONE;
Ich denke, deine einzige Möglichkeit ist ..
EditText Android:inputType="text" ... />
Sie können den Text auf 3 Punkte überprüfen, die eine IP-Adresse enthält
Ich denke, Sie müssen TextWatcher zur Validierung verwenden, es mit TextView.addTextChangedListener () registrieren und Pattern.DOMAIN_NAME und Pattern.IP_ADDRESS (Android 2.2+) verwenden.
Sehen:
Android: Wie kann ich die Eingabe von EditText überprüfen?
IP in Android überprüfen
Wenn Sie 2 Radiobutton verwenden, zeigt einer einen Edittext für Host, der andere zeigt 4 numerische Edittext für IP. Sobald der Benutzer die Daten übermittelt hat, werden alle 4 Edittext-Werte mit Punkten zwischen ihnen gespeichert. ) + "." + edittext2.getText () + "." edittext3.getText () + "." edittext4.getText (), damit Sie eine solche validierte IP-Adresse erhalten können, aber dies bedeutet natürlich mehr Arbeit.
Versuchen Sie es mit Android:inputType="textUri"
. Es funktioniert besonders gut, wenn Sie einen Hostnamen oder eine IP-Adresse wünschen.