Отключение полноэкранного редактирования для ввода мягкой клавиатуры в альбомной ориентации?

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

Я предполагаю, что это может быть достигнуто с помощью метода setExtractViewShown(false) на InputMethodService, но я не могу получить доступ к экземпляру по умолчанию этого и не хочу реализовывать собственный метод ввода.

Android fullscreen editing view

Отредактировано для добавления: представление, к которому идет ввод, не является TextView (это a View с пользовательской реализацией InputConnection), поэтому android:imeOptions="flagNoExtractUi" не будет работать здесь.

Ответ 1

Я наконец ответил на свой вопрос:

Пользовательский интерфейс извлечения (то есть режим полноэкранного редактирования) может быть отключен в тот момент, когда подключено входное соединение:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

    outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;

    // etc.
}

Ответ 2

Для этого перейдите к операции xml и вставьте android:imeOptions="flagNoExtractUi" в своем коде. А куда его наклеивать? Взгляните на код примера активности xml и посмотрите на EditText:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"         
    >

    <EditText
        android:imeOptions="flagNoExtractUi"
        android:id="@+id/etTextInAct"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >   
        <requestFocus />
    </EditText>

</LinearLayout>

Если вам нужны дополнительные параметры настройки клавиатуры, см. Http://developer.android.com/guide/topics/ui/controls/text.html

Ответ 3

добавьте свойство android:imeOptions="flagNoExtractUi" к каждому EditText в ваш XML файл.

Ответ 4

Ответ выше помог мне разобраться с решением для динамически добавленных EditTexts:

editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);

Ответ 5

Используйте android:imeOptions="flagNoFullscreen" для достижения этой функции.

Ответ 6

Кроме того, если вы хотите объединить несколько программных продуктов imeOptions, вы можете использовать | синтаксис.

Например, чтобы отключить полноэкранное редактирование в ландшафте и заменить клавишу "Далее" клавишей "ОК" (ACTION_DONE) на клавиатуре, вы можете использовать:

editText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);

Ответ 7

Если вы изменяете IME напрямую, вы можете предотвратить отображение onUpdateExtractingVisibility переопределив onUpdateExtractingVisibility:

@Override
public void onUpdateExtractingVisibility(EditorInfo ei) {
    ei.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
    super.onUpdateExtractingVisibility(ei);
}

Ответ 8

Я знаю, что это немного поздно, но для тех, кто все еще заинтересован, вот мое решение: в моем случае у меня была ландшафтная активность, содержащая EditText сверху, и мне нужно было реализовать функцию автозаполнения в этой поисковой активности, которая перекрывается клавиатура вызвала проблему, из-за которой пользователь не мог видеть результат RecyclerView. Таким образом, я получил этот EditText в моем макете:

<EditText
  android:layout_width="match_parent"
  android:layout_height="?actionBarSize"
  android:id="@+id/main_search_et"
  android:imeOptions="actionSearch|flagNoExtractUi"
  android:inputType="text"  />

Ура!

Ответ 9

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

android:imeOptions="flagNoFullscreen" 

в вашем edittext

Ответ 10

Мое решение:

android:imeOptions="flagNoExtractUi|flagNoFullscreen"

Ответ 11

Вы можете позвонить, чтобы скрыть программную клавиатуру и очистить фокус от окна поиска.

public void hideKeyboard(View view) {
    InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

super.clearFocus();