Intereting Posts
Доступность Отсутствует contentDescription атрибут на изображении, как удалить это предупреждение? Изменение шрифта закусочной Метод onResume () активности запуска запускается дважды, но onCreate () только один раз WiFi Direct (Android 4.0) с несколькими (3+) устройствами Как удалить элемент из RecyclerView с задержкой Реализация onScrollListener для обнаружения конца прокрутки в ListView На некоторых устройствах Android отсутствует символ «Сердце» Масштабирование и панорамирование вида в андроиде CookieManager и CookieSyncManager не синхронизируют файлы cookie с веб-просмотром в ICS (работает на всех предыдущих уровнях API) Как загружать элементы в виджет списка виджетов Android? Android: Crash: двоичная строка XML-файла: ошибка раздувания класса (с использованием SurfaceView) Как показать соответствующий значок в диалоговом окне Как получить ширину и высоту изображения? Как растянуть / масштабировать фоновые изображения в линейном формате Android? Unity 2D: Как поддерживать многоплатформенные и различные устройства соотношения сторон в Unity 2D?

Текстовое поле IP-адреса в Android?

Я абсолютно не знаком с Android.

Я хотел бы ввести текстовое поле, где пользователь может ввести IP-адрес … но как я могу ограничить пользователя только вводить числа? … и как я могу проверить?

Есть ли готовый ip-адрес-текстовое поле «там», которое я могу использовать?

Благодаря!

Mojo

Solutions Collecting From Web of "Текстовое поле IP-адреса в Android?"

Для проверки регулярное выражение -expressions.info имеет хорошую строку регулярных выражений, которую вы могли бы использовать для тестирования для IP в допустимом диапазоне (0-255):

\ Ъ (25 [0-5] | 2 [0-4] [0-9] |? [01] [0-9] [0-9]?) (25 [0-5] |. 2 [0 -4] [0-9] | [01] [0-9] [0-9]) (25 [0-5] |?. 2 [0-4] [0-9] | [01]? [0-9] [0-9]) (25 [0-5] |?. 2 [0-4] [0-9] | [01] [0-9] [0-9]) \? б

То, что я нашел, работает, чтобы установить EditText для использования android:inputType="phone" , поэтому вход ограничен цифрами, периодом и несколькими другими символами. Однако это позволит вам вводить адреса IPV4, поскольку это только цифры. Для проверки вам нужно будет получить входной текст и проанализировать его вручную.

Что касается готовых входных виджетах, я не сталкивался с ними.

В дополнение к тому, что сказал Эрих, вы можете использовать android: цифры = «0123456789». Запретить ничего, кроме цифр и десятичной точки.

Вы можете использовать :

 EditText ipAddress = (EditText)findViewById(R.id.ip_address); InputFilter[] filters = new InputFilter[1]; filters[0] = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, android.text.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; } }; ipAddress.setFilters(filters); 

Это, я думаю, самое полное из существующих решений для этого (по крайней мере, что я нашел). Единственное улучшение, которое я могу себе представить, – это реализовать новый KeyListener чтобы сдержать ввод лучше, но я не уверен, что это практически возможно, учитывая, как IME работают с макетами и т. Д.

 public class IPAddressText extends EditText { public IPAddressText(Context context) { super(context); setInputType(InputType.TYPE_CLASS_PHONE); setFilters(new InputFilter[] { new InputFilter(){ @Override public CharSequence filter(CharSequence source, int start, int end, android.text.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; } } }); addTextChangedListener(new TextWatcher(){ boolean deleting = false; int lastCount = 0; @Override public void afterTextChanged(Editable s) { if (!deleting) { String working = s.toString(); String[] split = working.split("\\."); String string = split[split.length - 1]; if (string.length() == 3 || string.equalsIgnoreCase("0") || (string.length() == 2 && Character.getNumericValue(string.charAt(0)) > 1)) { s.append('.'); return; } } } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (lastCount < count) { deleting = false; } else { deleting = true; } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // Nothing happens here } }); } } 

И поскольку это то, что я фактически использовал, вот версия EditTextPreference :

 public class IPAddressPreference extends EditTextPreference { public IPAddressPreference(Context context) { super(context); getEditText().setInputType(InputType.TYPE_CLASS_PHONE); getEditText().setFilters(new InputFilter[] { new InputFilter(){ @Override public CharSequence filter(CharSequence source, int start, int end, android.text.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; } } }); getEditText().addTextChangedListener(new TextWatcher(){ boolean deleting = false; int lastCount = 0; @Override public void afterTextChanged(Editable s) { if (!deleting) { String working = s.toString(); String[] split = working.split("\\."); String string = split[split.length - 1]; if (string.length() == 3 || string.equalsIgnoreCase("0") || (string.length() == 2 && Character.getNumericValue(string.charAt(0)) > 1)) { s.append('.'); return; } } } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (lastCount < count) { deleting = false; } else { deleting = true; } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // Nothing happens here } }); } } 

Я использую этот TextWatcher:

 public class IPTextWatcher implements TextWatcher { private static String LOG_TAG = "IPTextWatcher"; private EditText editText; private BarcodeTextWatcher.ChangeListener listener = null; public IPTextWatcher( EditText editText ) { this.editText = editText; } private static final String IPADDRESS_PATTERN = "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; @Override public void afterTextChanged( Editable s ) { Log.v( LOG_TAG, s.toString() ); if( !s.toString().matches( IPADDRESS_PATTERN ) ) { String ip = format( s.toString() ); editText.removeTextChangedListener( this ); editText.setText( ip ); editText.setTextKeepState( ip ); Selection.setSelection( editText.getText(), ip.length() ); editText.addTextChangedListener( this ); if( listener != null ) listener.onChange(); } } public static String format( String value ) { String userInput = "" + value.replaceAll( "[^\\d\\.]", "" ); StringBuilder ipBuilder = new StringBuilder(); String[] address = userInput.split("\\."); String glue = null; for( String part : address ) { if( glue != null ) ipBuilder.append( glue ); int p = Integer.valueOf( part ); if( p >= 256 ) { int i = 1; do { p = Integer.valueOf( part.substring( 0, part.length() -i ) ); i++; } while( p >= 256 ); } ipBuilder.append( p ); glue = "."; } if( userInput.charAt( userInput.length()-1 ) == '.' ) ipBuilder.append( "." ); return ipBuilder.toString(); } @Override public void onTextChanged( CharSequence s, int start, int before, int count ) { } @Override public void beforeTextChanged( CharSequence s, int start, int count, int after ) { } } 
  <EditText android:id="@+id/ip_address" android:inputType="number|numberDecimal" android:digits="0123456789." android:layout_width="match_parent" android:layout_height="wrap_content"/> .  <EditText android:id="@+id/ip_address" android:inputType="number|numberDecimal" android:digits="0123456789." android:layout_width="match_parent" android:layout_height="wrap_content"/> 

Работал на меня