четверг, 26 февраля 2015 г.

EditText, InputMode

Небольшой экран мобильного устройства требует тщательной проработки расположения элементов пользовательского интерфейса. Экранная клавиатура также охватывает много места на экране. Но в то же время Android предоставляет возможности гибкой настройки для отображения экранной клавиатуры и текстовых полей.

Настройка режимов отображения устанавливается в файле манифеста приложения для каждого Activity, входящего в состав приложения. В элементе <activity> для этого существует необязательный атрибут (по умолчанию он отсутствует) android:windowSoftInputMode.

Этот атрибут определяет два типа вариантов поведения экранной клавиатуры и текстовых полей, находящихся в данном Activity — состояние отображения экранной клавиатуры и поведение текстовых полей при получении или потере фокуса и вводе текста.

Варианты поведения экранной клавиатуры могут быть следующими:
  • stateUnspecified — система сама выбирает подходящее поведение экранной клавиатуры. Это настройка по умолчанию;
  • stateUnchanged — экранная клавиатура при получении Activity (на котором текстовое поле) фокуса ввода сохраняет свое последнее состояние, видимое или скрытое;
  • stateHidden — экранная клавиатура скрыта, когда пользователь открывает Activity. Клавиатура появится при наборе текста. Если пользователь перейдет к следующему Activity, клавиатура скроется. Но при возвращении назад клавиатура останется на экране, если она была видима при закрытии Activity;
  • stateAlwaysHidden — экранная клавиатура всегда скрывается, если Activity получает фокус;
  • stateVisible — экранная клавиатура видима в обычном режиме (поведение такое же, как в приложении из предыдущего раздела);
  • stateAlwaysVisible — экранная клавиатура отображается сразу, когда пользователь открывает Activity.
Для определения поведения текстовых полей имеется три значения:
  • adjustResize — размеры элементов, находящихся на Activity, могут изменяться, освобождая место для экранной клавиатуры;
  • adjustPan — окно Activity и его элементы не изменяются при отображении экранной клавиатуры, только автоматически подстраиваются, чтобы текстовое поле, находящееся в фокусе ввода, не было закрыто клавиатурой. Такое поведение используется реже, т. к. остальные элементы, находящиеся на этом Activity, например кнопки, становятся недоступными, и надо закрывать клавиатуру для доступа к ним;
  • adjustUnspecified — система Android автоматически выберет один из перечисленных ранее режимов в зависимости от компоновки окна Activity и количества дочерних элементов управления на нем. Это настройка по умолчанию для Activity.
Поведение экранной клавиатуры и текстовых полей в атрибуте android:windowSoftInputMode задается их комбинацией с использованием знака |, например, так:

<activity
    android:windowSoftInputMode="stateVisible|adjustResize"
    . . .
</activity>
Чтобы разобраться, как эти настройки поведения экранной клавиатуры и текстовых полей выглядят на экране, создадим новый проект EditTextInputModes. В файл манифеста приложения добавим атрибут android:windowSoftInputMode и выставим ему значение stateVisible|adjustPan.
Файл манифеста приложения AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=
      "http://schemas.android.com/apk/res/android"
    package="com.samples.ui.edittextinputmode"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="10" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".EditInputModeActivity"
            android:windowSoftInputMode="stateVisible|adjustPan">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>
В файле компоновки main.xml окна приложения используем три текстовых поля такого же типа, как в предыдущей программе, но внесем некоторые изменения — с помощью атрибутов android:layout_height и android:layout_weight равномерно распределим эти поля на весь экран.
Файл компоновки main.xml для проекта EditTextInputModes
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=
      "http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:inputType="textEmailAddress"
        android:layout_weight="1"
        android:hint="Enter e-mail"/>
    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:inputType="number"
        android:hint="Enter number"
        android:layout_weight="1" />
    <EditText
        android:id="@+id/editText3"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:inputType="textPassword"
        android:hint="Enter password"
        android:layout_weight="1" />
</LinearLayout>
Если запустить приложение и начать вводить информацию в текстовые поля, будет отображена экранная клавиатура и одновременно пропорционально уменьшатся размеры по вертикали всех текстовых полей.


Теперь изменим поведение приложения, поменяв значение в атрибуте android:windowSoftInputMode в манифесте приложения:

android:windowSoftInputMode="stateVisible|adjustPan"
Если перекомпилировать и запустить приложение, то при вводе текста в режиме adjustPan экранная клавиатура будет затенять часть окна Activity вместе с элементами.


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



Комментариев нет:

Отправить комментарий