Статьи

Android Keyboard Hacks – Скрыть клавиатуру и настроить действия

В этом посте рассказывается о различных хакерских кодах, используемых для управления внешним видом и поведением программной клавиатуры Android.

Большинству приложений на основе форм часто требуется настроить поведение программной клавиатуры Android по умолчанию. Часто требуется контролировать тип клавиатуры, которую вы хотите предоставить пользователю для ввода данных, или настроить внешний вид действия клавиши Enter на клавиатуре.

Давайте сначала начнем с управления типом клавиатуры для отображения при редактировании данных формы.

1. Установите тип ввода TextView

Существуют различные типы клавиатуры, разработанные для удобства пользователя. Например, если для ввода числа необходимо отобразить цифровую клавиатуру. Это может контролироваться свойством InputType TextView. InputType управляет такими аспектами, как тип данных, помещаемых в текстовое поле. Как правило, вы можете выбрать одно значение, хотя некоторые могут быть объединены вместе, как указано. Установка этого атрибута для чего-либо кроме ничего также подразумевает, что текст является редактируемым.

Некоторые из наиболее используемых констант ввода типа включает в себя,  nonetext, textCapCharacterstextCapWordstextCapSentencestextAutoCorrect, textAutoCompletetextMultiLinetextImeMultiLinetextUri, textEmailAddresstextPasswordtextWebEditTexttextPhonetic, textWebEmailAddressnumberphonedatetimedate, и  time.

Вы можете установить свойство inputType в объявлении макета следующим образом

<EditText
   android:id="@+id/text1"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:imeOptions="actionSearch"
   android:singleLine="true"
   android:inputType="number" />

2. Настройте метод ввода

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

Когда клавиатура видна на экране, текст на клавише Enter обычно указывает ее действие в зависимости от порядка фокусируемых элементов в представлении. Если не указано, на клавиатуре будет отображаться действие «Далее», если в представлении есть больше возможностей для фокусировки, или действие «Готово», если последний элемент в данный момент сфокусирован. В случае многострочного поля это действие представляет собой возврат строки.

Это значение можно настроить с помощью  android:imeOptions значения в объявлении TextView XML. android:imeOptions Атрибут доступ следующих возможных значений:

  • actionUnspecified:  это свойство отображает действие по выбору устройства. Событием Action является IME_NULL. Это действие клавиатуры по умолчанию.
  • actionGo:  отображает Go как клавишу ввода. Событие действия IME_ACTION_GO
  • actionSearch:  отображает значок поиска в виде клавиши ввода. Событием действия является IME_ACTION_SEARCH.
  • actionSend:  отображает «Отправить» как клавишу ввода. Событие действия IME_ACTION_SEND
  • actionNext:  отображает Next как клавишу ввода. Событие действия IME_ACTION_NEXT
  • actionDone:  отображает Done в качестве клавиши ввода. Событие действия IME_ACTION_DONE

Весь приведенный выше набор констант событий действия определен в классе EditorInfo.

Давайте рассмотрим пример макета с двумя редактируемыми текстовыми полями. Первый EditText отобразит значок поиска для клавиши Enter, а второй — Go. Результирующий вывод может сильно зависеть от текущей клавиатуры, установленной на устройстве.

<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/text1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:imeOptions="actionSearch"
        android:singleLine="true" />

    <EditText
        android:id="@+id/text2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:imeOptions="actionGo"
        android:singleLine="true" />
</LinearLayout>

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

3. Добавление пользовательских действий

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

В следующем фрагменте кода показано, как создать настраиваемое действие для EditTexts.

public class MainActivity extends Activity implements OnEditorActionListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        //Add the listener to the views
        EditText editText1 = (EditText) findViewById(R.id.text1);
        editText1.setOnEditorActionListener(this);

        EditText editText2 = (EditText) findViewById(R.id.text2);
        editText2.setOnEditorActionListener(this);
    }

    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            //Handle search key click
            return true;
        }
        if (actionId == EditorInfo.IME_ACTION_GO) {
            //Handle go key click
            return true;
        }
        return false;
    }
}

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

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

4. Скрыть мягкую клавиатуру

Следующий фрагмент кода поможет вам скрыть или убрать программную клавиатуру с экрана.

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);

hideSoftInputFromWindow() Занимает  IBinder  окно лексемы в качестве параметра. Это может быть получено из любого объекта View, в настоящее время прикрепленного к окну через  View.getWindowToken().