Отключить полноэкранный режим редактирования для ввода с программной клавиатуры в альбомной ориентации?
На устройствах Android, использующих программные клавиатуры, я хочу запретить отображение полноэкранного режима редактирования клавиатуры (показанного ниже) в альбомном режиме (т.е. я хочу видеть только саму программную клавиатуру и мой вид за ней).
Я предполагаю, что это может быть достигнуто с помощью setExtractViewShown(false)
метод на InputMethodService
, но я не могу получить доступ к экземпляру по умолчанию этого и не хочу реализовывать пользовательский метод ввода.
Отредактировано, чтобы добавить: представление, к которому идет ввод, не является TextView
(это View
с обычаем InputConnection
реализация), так android:imeOptions="flagNoExtractUi"
не будет работать здесь.
11 ответов
Я наконец-то ответил на свой вопрос:
Пользовательский интерфейс извлечения (т.е. полноэкранный режим редактирования) может быть отключен в точке подключения входного соединения:
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;
// etc.
}
Для этого просто перейдите к действию 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
Добавить недвижимость android:imeOptions="flagNoExtractUi"
для каждого EditText
в вашем XML
файл.
Ответ выше помог мне найти решение для динамически добавленных EditTexts:
editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Использование android:imeOptions="flagNoFullscreen"
чтобы достичь этой функции.
Кроме того, если вы хотите объединить несколько imeOptions программно, вы можете использовать | синтаксис.
Например, чтобы отключить полноэкранный режим редактирования в альбомной ориентации и заменить клавишу "Далее" на "ОК" (ACTION_DONE) на клавиатуре, вы можете использовать:
editText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Мое решение:
android:imeOptions="flagNoExtractUi|flagNoFullscreen"
Если вы изменяете IME напрямую, вы можете предотвратить отображение ExtractedView, переопределив onUpdateExtractingVisibility
:
@Override
public void onUpdateExtractingVisibility(EditorInfo ei) {
ei.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
super.onUpdateExtractingVisibility(ei);
}
Я знаю, что уже немного поздно, но для тех, кто все еще заинтересован, вот мое решение: в моем случае у меня была ландшафтная активность, содержащая 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" />
Ура!
Ты можешь использовать:
android:imeOptions="flagNoFullscreen"
в вашем тексте редактирования
Вы можете позвонить, чтобы скрыть мягкую клавиатуру и очистить фокус от поиска.
public void hideKeyboard(View view) {
InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
super.clearFocus();