Что такое touch mode и с чем его лучше не есть если вы разработчик
Проектирование и разработка пользовательских интерфейсов для Android сильно отличается от проектирования desktop среды. Так как Android работает на мобильных устройствах, создатели и дизайнеры приложений должны обращать внимание на многочисленные обстоятельства. Для облегчения создания лучших приложений и будет написан цикл статей. Для начала статья первая о touch mode, которую вы сейчас читаете.
Touch mode это режим, рассчитанный на взаимодействие пользователся с телефоном посредством прикосновений. Сам по себе этот режим довольно прост, также не является сложным вход и выход из режима. Например в телефоне G1 выбор виджета при помощи трекбола выведет вас из «touch mode», но прикосновение к кнопке на экране пальцем вернёт вас в этот режим снова. Только один API напрямую связан с «touch mode», это View.isInTouchMode().
Правда звучит всё просто? Тем не менее «touch mode» может быть гораздо полезнее и сложнее, чем кажется. Посмотрим почему.
Создание тулкитов пользовательского интерфейса для мобильных устройств сложно из-за различных механизмов взаимодействия, которые они должны обеспечивать. У некоторых устройств только 12 кнопок, у некоторых есть сенсорный экран, некоторые используют стилус, некоторые имеют как сенсорный экран, так и клавиатуру. Очень значимо для общества разработчиков Android то, что первое доступное коммерческое устройство, а именно G1, предлагает различные формы ввода: трекбол, сенсорный экран и клавиатура. Из-за того что пользователь может взаимодействовать с приложениями используя три различных способа, нужно задуматься о всех возможных вопросах, которые вследствие этого возникают.
Представьте себе простое приложение, ApiDemos например, которое отображает список текстовых элеметов. Пользователь может свободно перемещаться по списку с помощью трекбола и может также перематывать и выделять элементы при помощи пальцев. Вопрос в данном случае — выделение. Если выделить элемент, в верхней части списка, а затем перемотать список до самого низа, то что должно произойти с выделением? Должно ли оно оставаться на месте или следовать за экраном? Или если нажать трекбол чтобы подействовать на элемент вне экрана? После тщательного обдумывания было решено в таких случаях сбрасывать выделение вообще.
В «touch mode», нет фокуса и выеления. Любой выбранный элемент в списке или в ячейке становится невыделенным, как только пользователь переходит в «touch mode». Кроме того, любые выделенные виджеты становятся нефокусированными при переходе в этот режим. Изображения ниже показывают что происходит после прикосновения к списку, если раньше было выделение посредством трекбола:

Чтобы сделать всё более естественным, фреймворк знает, как восстановить выделение/выбор, когда пользователь покидает «touch mode». Например, в приведенном выше примере, если пользователь использует трекбол снова, выделение появится снова на ранее выбранном объекте. Вот почему некоторые разработчики удивляются, когда они создают пользовательский интерфейс и начинают получать ключевые события только после активации трекбола: их приложения в «touch mode», и они должны использовать трекбол для выхода из «touch mode» и восстановления фокуса.
Отношения между «touch mode», выделением и фокусом означают, что вы не должны полагаться на выделение и / или фокус в вашем приложении. Очень распространенная проблема новых Android разработчиков состоит в том, что они полагаются на ListView.getSelectedItemPosition (). В «touch mode», этот метод вернет INVALID_POSITION. Вы должны использовать вместо него click listeners или choice mode.
Focusable in touch mode
Теперь, когда вы знаете, что фокусировки нет в «touch mode», нужно объяснить что это не совсем так. Фокус может существовать в «touch mode», но в весьма особым образом, разработчики называют его «focusable in touch mode». Этот специальный режим был создан для виджетов, которые получают ввод текста, как EditText или, если включена фильтрация, ListView. Именно поэтому пользователь может ввести текст внутри текстового поля без предварительного выбора его с трекбола или пальцем. Когда пользователь касается экрана, приложение переходит в «touch mode», если он ещё не в этом режиме. Что произойдет при переходе в «touch mode» зависит от того, чего пользователь коснулся, и того, что в настоящее время находится в фокусе. Если пользователь коснется «focusable in touch mode» виджета, виджет получит фокус. Любой виджет, который на данный момент находится в фокусе не утратит его если он «focusable in touch mode». Например, на рисунке ниже, когда пользователь касается экрана, поле ввода текста получает фокус.

Focusable in touch mode — это свойство, которое вы можете установить либо из кода либо из XML. Тем не менее, оно должна быть использовано редко и лишь в весьма специфических ситуациях, т.к. это может изменить нормальное поведение приложения для Android. Игра — хороший пример приложения, к которому нужно применять «focusable in touch mode» свойство. MapView, если они используются в полноэкранном режиме, как и в Google Maps, является еще одним наглядным примером того, как вы можете использовать «focusable in touch mode» правильно.
Ниже приводится еще один пример «focusable in touch mode» виджета. Когда пользователь нажимает AutoCompleteTextView своим пальцем, фокус остается на поле ввода текста:


Новые Android разработчики часто думаю о том, что «focusable in touch mode» — решение, которое может "устранить" проблему исчезновения выделения / фокуса. Мы действительно рекомендуем вам хорошо подумать, прежде чем использовать его. Если использовать его неправильно, это может сделать поведение вашего приложения не таким, как остальной системы, просто сломать пользовательские привычки. Фреймворк Android содержит все средства, необходимые для обработки взаимодействий пользователей без использования «focusable in touch mode». Например, вместо того чтобы пытаться заставить ListView всегда оставаться выделенным, просто используйте «appropriate choice mode». И если вы чувствуете, что фреймворк не соответствует всем вашим потребностям, не стесняйтесь дать знать разработчикам или сделайте патч.
Совет:
*Оставайтесь близки к основным приложениям.
* Используйте соответствующую функцию, если вам нужно стабильное выделение (радио-кнопку, флажок, ListView choice mode и т.д.).
* Используйте focusable in touch mode если вы пишете игру.
Не следует:
* Не пытайтесь жёстко фиксировать фокус или выделение в «touch mode».
Комментарии
4 дня 9 часов назад
4 дня 22 часа назад
5 дней 11 минут назад
5 дней 1 час назад
5 дней 6 часов назад
16 недель 1 день назад
1 год 7 недель назад
1 год 9 недель назад
1 год 11 недель назад
1 год 29 недель назад