Ответ 1
Попробуйте использовать android:inputType="number"
, но также установите android:digits="0123456789."
. Работает для меня.
Я создаю небольшое приложение для Android, в котором пользователь вводит IP-адрес или имя хоста в виджет EditText. 90% времени они будут вводить IP-адрес, а остальное время - имя хоста.
Поэтому, естественно, я хочу оптимизировать для упрощения ввода IP-адреса, но важно переключиться на альфа-число для ввода имени хоста.
Я не могу найти хороший тип ввода. Первоначально numberDecimal
казался хорошим выстрелом, но он допускал только одну точку.
В идеале я хотел бы начать со стандартной клавиатуры, на которой была нажата кнопка ?123
.
Как мне туда добраться?
Попробуйте использовать android:inputType="number"
, но также установите android:digits="0123456789."
. Работает для меня.
Если вы используете inputType="phone"
, вы получаете доступ к вырезанной клавиатуре, содержащей цифры и символ периода, - это не ограничивает ввод в отношении количества периодов, которые вы можете ввести.
Пожалуйста, смотрите этот ответ для подтверждения при вводе.
Это отлично работает с цифрами и десятичными словами, добавив android: inputType = "number | numberDecimal" и 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"/>
Вы можете использовать свой собственный входной фильтр для этого
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);
используйте это:
<EditText
android:id="@+id/txtIP"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:digits="0123456789."
/>
Я думаю, что ваш единственный вариант...
EditText android:inputType="text" ... />
Вы можете проверить текст на 3 точки, IP-адрес содержит
Я думаю, вам нужно использовать TextWatcher для проверки, зарегистрировать его с помощью TextView.addTextChangedListener() и используйте Pattern.DOMAIN_NAME и Pattern.IP_ADDRESS (Android 2.2 +).
См:
Android: как я могу проверить ввод EditText?
Проверка IP-адреса в android
Вы можете расширить DigitsKeyListener (source) и изменить функцию filter() (проверка, которая будет проверять либо шаблон ip, либо строку hostname) и getInputType() до return InputType.TYPE_CLASS_PHONE;
<EditText
android:id="@+id/ip_address"
android:inputType="number|numberDecimal"
android:digits="0123456789."
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
работал у меня
Может быть, если вы используете 2 радиообъектива, один показывает edittext для хоста, другой показывает 4 цифровых edittext для IP, тогда, как только пользователь отправит данные, вы соедините все 4 значения edittext с точками между ними, что-то вроде этого, edittext1.getText() + "." + edittext2.getText() + "." edittext3.getText() + "." edittext4.getText(), чтобы вы могли получить одобренный IP-адрес, как это, но, очевидно, это будет означать большую работу.