Android окно для ввода параметров

EditText — ввод данных в Android Studio

Очень сложно представить себе аппликацию, которая не требовала бы от пользователя, на каком-нибудь этапе, ввода данных. Для человека, который занимается программированием, тем более — разработкой аппликаций, необходимость в элементах, компонентах для ввода данных пользователем является настолько очевидным фактом, что я просто не вижу совершенно никакой необходимости в том, чтобы объяснять и обосновывать, для чего нужны такие элементы. Именно поэтому сразу перейдем к обсуждению и изучению этих элементов.

Создайте аппликацию, которая принимает от пользователя данные: имя пользователя и год его рождения, после чего сообщает пользователю его возраст. В случае ввода нелогичных данных, аппликация должна сообщать об этом пользователю. Аппликация будет называться Userlnfo001. Прежде всего создаем новую аппликацию, указываем ее имя в соответствии с заданием и выбираем для главной (и, по-прежнему, единственной) активности имя Main.

Теперь примем следующие решения по дизайну активности:

— панель-контейнер сделаем типа LinearLayout, с вертикальным расположением элементов (один под другим), с «центром тяжести» в центре экрана;

— на панели разместим две «наклейки» (TextView), под каждой из которых будут элементы типа «поле ввода данных» (EditText);

— нижним элементом будет «кнопка» (Button), при нажатии на которую будет осуществляться ввод данных, их проверка и показ итогового сообщения.

Элементы типа «поле ввода данных» располагаются в категории Text на панели элементов (компонентов), Palette:
Обратите внимание, что есть полтора десятка разновидностей этого типа элементов! Мы сделаем следующий выбор: первое поле (для имени) выбе­рем подтипа Plain Text, а второе поле, для ввода года рождения, выберем подтипа Number. Компоненты типа «наклейка» и «кнопка» находятся в категории Widgets (TextView и Button).

Только первым делом следует сменить тип панели и установить для сме­ненного типа два дополнительных свойства, ориентацию (вертикально) и «центр тяжести» (по центру экрана):

Теперь добавим элементы в соответствии с макетом и договоренности о типах элементов.
Получится вот такое «дерево компонентов»:

Если у вас идентификаторы, которые Android Studio автоматически при­своила элементам, другие — не обращайте на это никакого внимания, мы все равно будем их менять на «осмысленные». Выберем следующие:

Вместе с заменой идентификаторов, будет правильно заменить и тексты, которые с самого начала будут показаны (или не показаны) на компонентах.

Можно воспользоваться способом, использованным в предыдущей аппли­кации: напрямую заменить тексты в свойствах элементов. Но мы сделаем это способом, который считается (и по праву является!) более профессиональным: создадим глобальные значения, которые можно будет в даль­нейшем, при желании и необходимости, использовать в любых активно­стях аппликации. Способ этот более длинный, но я рекомендую приучаться к использованию именно его.

В папке res, в подпапке values, откройте файл strings.xml, и внесите в него три новых значения:

После добавления наших двух параметров мы можем в xml-файле актив­ности указать в соответствующем свойстве, что следует использовать именно эти параметры, (в двух элементах типа «наклейка» и «кнопка»).

android:text=»@string/1v_name»

android:text=»@string/tv_year»

android:text=»@string/btn_go»

В чем, собственно, удобство именно такого способа размещения надписи на элементах? В том, что если ще-то в будущих активностях этой же аппликации мы решим использовать эти надписи, то нам не придется снова набирать их, достаточно будет указать, что надо использовать соответствующие па­раметры из файла staring.xml, который является общим для всех активно­стей аппликации, сколько бы их ни было. Кроме того, в будущем мы смо­жем использовать эти же параметры и в файлах java, а это еще одно пре­имущество такого способа использования строковых значений.

Читайте также:  Как изменить обои экрана блокировки android

Можно ли при этом продолжать использовать тот способ, которым мы вос­пользовались в предыдущей аппликации, то есть вписывать тексты (стро­ковые значения) напрямую и непосредственно в xml-файл, без их фикса­ции в общем файле strings.xml? Ответ прост: да, конечно. Все зависит от ваших намерений, от привычек работы, от необходимости использовать строковые значения в будущем или от решения не делать этого.

Запустим нашу аппликацию на исполнение. Кстати, а зачем это делать, если, фактически, мы еще ни чего особенного и полезного в ней и не сде­лали, и даже с дизайном только-только начали работать? Не рано ли?

Ни в коем случае не рано: следует сделать это даже обязательной привычкой! Надо запускать аппликацию после каждого, даже не очень существенного изменения в ней. Это нужно, чтобы убедиться: даже после внесенных изменений аппликация запускается.

Ну, то, что аппликация запускается; это хорошо. Но пока выглядит экран, мягко говоря, коряво. Следует, как минимум:
— увеличить размер шрифта в надписях;

— убрать текст Name в первом элементе «окно ввода данных»;

— установить границы между первой парой элементов и второй, а также между второй парой и «кнопкой»;

— установить размер «кнопки» по размеру надписи.

Рекомендую также установить цвет фона экрана (фон панели-контейнера) и цвет фона в элементах «окно ввода данных» (в большинстве случаев для них рекомендуется использовать белый фон).

Источник

Поле ввода числовых значений в Android

Начнем с требований

Анализ

Из всего спектра элементов управления в Android нас интересует виджет EditText .
Обратимся к документации и посмотрим, что нам предлагает Android SDK.

EditText наследуется от TextView , который, в свою очередь, обладает свойствами:
XML-разметка
digits – позволяет установить набор специальных символов, которые может принимать поле и автоматически включает режим ввода чисел.
numeric – задает обработчик ввода чисел.
inputType – с помощью набора константных значений позволяет сгенерировать требуемый обработчик ввода.

Публичные методы класса
setFilters – позволяет задать набор фильтров, которые будут применяться при вводе значений в поле.

digits , numeric и inputType позволяют ограничить набор вводимых символов, но никак не влияют на точность числа, а вот setFilters , как раз то, что нам нужно.

Реализация

Перед созданием собственного фильтра, сделаем так, чтобы в поле можно было вводить только числа и десятичный разделитель.

Читайте также:  Не поворачивать экран андроид

Теперь зададим собственный фильтр для поля ввода, чтобы принимать только значения соответствующие заданной точности.
Нам потребуется реализовать интерфейс InputFilter , а конкретно переопределить метод filter .

Согласно документации, этот метод вызывается при замене значения в поле ввода (dest) в диапазоне от dstart до dend на текст из буфера (source) в диапазоне от start до end.

Метод возвращает объект класса CharSequence , который будет установлен в поле ввода взамен текущему значению. Если заменять значение поля ввода не требуется, то в методе следует вернуть null .

В конструктор нашего фильтра будем передавать количество символов до и после десятичного разделителя.

Переопределяем метод filter . Алгоритм проверки вводимых значений следующий:

  1. До помещения буферного значения в поле ввода мы будем вставлять это значение в некоторую переменную.
  2. Если полученное значение удовлетворяет нашим требованиям точности, то мы разрешаем ввод, вернув null .
  3. В противном случае возвращаем пустую строку, тем самым отказываясь от вводимого значения.

Формируем будущее значение после ввода пользователя:
Для удобства манипуляция со строкой, создадим экземпляр класса StringBuilder на основе исходного значения поля ввода и произведем необходимые замены с учетом вводимого значения.

В результате в переменной newText будет содержаться будущее значения текстового поля.

Теперь нам следует проверить корректность нового значения.
Оно должно удовлетворять следующим условиям:

  1. Количество десятичных разделителей не должно превышать 1.
    123, 123.45 — верно, 12.3.4 — неверно.
  2. Количество символов целой и дробной частей числа должно удовлетворять заданной точности.

Проверим количество разделителей, для этого мы переберем все символы результирующей строки.
Если найдется десятичный разделитель, то запомним его индекс. В случае повторного нахождения разделителя, ввод считается некорректным и цикл останавливается.

В завершении возвращаем результат.
Если ввод корректный, то возвращаем null , тем самым принимая вводимые значения,
в противном случае возвращаем пустую строку, чтобы не передавать в поле ввода значения.

Отладка

Видим, что приложение корректно обрабатывает целую и дробную части числа, запрещает вводить несколько десятичных разделителей.
Однако наблюдается интересная ситуация, если удалить десятичный разделитель, то мы выходим за границы точности.

Об этом упоминается в документации

Be careful to not to reject 0-length replacements, as this is what happens when you delete text.

Нужно быть осторожным с заменами нулевой длины, как это происходит при удалении текста.
Что же произошло на самом деле?

Наш алгоритм отработал корректно и в условии проверки длины целой части числа выявил, что допустимая точность нарушена и вернул пустую строку. Но само действие удаления символов было применено к исходному значению поля ввода.

Решим эту проблему следующим образом — выявим факт удаления символов. Документация подсказывает, что в этом случае происходит замена с нулевой длиной. Выделим из исходного значения поля ввода удаляемые символы и вернем их в качестве результата нашего метода, тем самым откажемся от удаления.
Нам потребуется изменить блок кода, где возвращается результат

Читайте также:  Android remote access что это

Таким образом контрольный пример выполнен, заданная точность достигнута.

Библиотека успешно используется в продакшене.
Подключить её можно с помощью Gradle

Бонус

Часто бывает необходимым запретить отображение системной клавиатуры для поля ввода.
Например, если используется клавиатура из приложения.

На помощь приходит метод класса EditText, появившийся в Android версии 21 и выше:
setShowSoftInputOnFocus(boolean show)

Вообще-то, этот метод был и в ранних версиях, но был приватным.

public void showSoftInputOnFocusCompat(boolean isShow) <

Источник

Настройки в Android-приложениях

Интересуюсь темой разработки под Android. Пишу небольшое приложение. Столкнулся с тем, что не до конца понимаю как правильно делать настройки для приложения. Немного погуглил, нашел статью, которая помогла разобраться. Решил перевести статью для русскоязычного сообщества, включив некоторые комментарии к оригиналу.

Настройки являются важной частью приложений на Android (и не только на Android — здесь и далее примечание переводчика). Это очень важно — позволять пользователям изменять настройки приложения, в зависимости от их предпочтений.

Существует два пути работы с настройками в Android — можно создать файл preferences.xml в директории res/xml, либо работать с настройками из кода. В данной статье я покажу как работать с настройками, используя preferences.xml файл.

Элементы настроек имеют следующие атрибуты:

  • android:key — имя настройки, по поторому в дальнейшем можно получить ее значение
  • android:title — заголовок элемента настройки
  • android:summary — краткое описание элемента настройки
  • android:defaultValue — значение по умолчанию

В настоящее время доступны следующие типы элементов настроек:

  • CheckBoxPreference — простой чекбокс, который возвращает значения true или false.
  • ListPreference — группа переключателей (radioGroup), из которых может быть выбран только один элемент. Атрибут android:entries указывает на массив со значениями в res/values/arrays.xml, а android:entryValues на массив с подписями.
  • EditTextPreference — показывает диалоговое окно с полем ввода. Возвращает строку в качестве значения.
  • RingtonePreference — группа переключателей с выбором рингтона.
  • Preference — настройка, работающая как кнопка.
  • PreferenceScreen — экран с настройками. Когда один PreferenceScreen вложен в другой, то открывается новый экран с настройками.
  • PreferenceCategory — категория настроек.
Экран с настройками
EditTextPreference
ListPreference
RingtonePreference
PreferenceScreen

Скриншоты выше были сгенерированы при помощи следующего preferences.xml:

Атрибуты android:entries и android:entryValues у ListPreference ссылаются на @array/listArray и @array/listValues соответственно. Значения берутся из res/values/arrays.xml, который в нашем случае выглядит следующим образом:

Для того, чтобы показать пользователю экран с настройками, небходимо создать активити, унаследованное от PreferenceActivity. Пример активити:

А вызвать активити с настройками можно, нажав на кнопку на нашем главном активити:

Для того, чтобы использовать выставленными в настройках значениями, добавим метод getPrefs() в главное активити, который нужно вызывать на событии onStart(). Нужно использовать именно onStart(), а не onCreate(), для того, чтобы быть уверенным в том, что используются актуальные настройки, а не те, что были во время создания гланого активити. Наш метод getPrefs() может выглядеть примерно вот так:

Источник

Оцените статью