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

237

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

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

Android-полноэкранный режим редактирования

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

jnic
источник
Давай попробуем это увидеть. Это хорошо для тебя. [Посмотрите на это] [1] [1]: stackoverflow.com/questions/8648401/…
sonida
у меня похожая проблема :( у вас может быть идея? stackoverflow.com/questions/36914290/…
railwanderer
2
как применять это на протяжении всего приложения. Мы не собираемся добавлять значение атрибута в каждый текст редактирования в XML.
Викас Пандей
2
Многие из ответов ниже рекомендуют использовать flagNoExtractUiили IME_FLAG_NO_EXTRACT_UI. Тем не менее, в документации для IME_FLAG_NO_EXTRACT_UI, которая соответствует flagNoExtractUi, говорится, что «Использование этого флага не рекомендуется, и он может устареть в будущем», так flagNoFullscreenчто это рекомендуемый вариант.
ThomasW

Ответы:

178

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

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

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

    outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;

    // etc.
}
jnic
источник
215
просто поместите в свой XML-файл android: imeOptions = "flagNoExtractUi"
1
JNIC, где вы сделали это переопределить в программном коде клавиатуры? SoftKeyboard.java? Я попробовал то же самое переопределение и error'd.
14
Вы, вероятно, захотите добавить флаг к опциям вместо того, чтобы переопределять все передаваемые опции, например:outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
ObsidianX
2
@ user726518 как применить этот атрибут к элементу окна поиска на панели действий?
Менна-Аллах Сами
1
Единственное, что работало при использовании настраиваемого вида для обработки клавиатуры. Спасибо!
Герман,
109

Для этого перейдите к действию 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

pbaranski
источник
64

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

Майкл Яворский
источник
1
Этот ответ слишком короткий и не соответствует стандартам качества SO. Пожалуйста, улучшите его, добавив некоторые дополнительные объяснения, чтобы он был полезен для сообщества, а не только для ОП.
Лоренцо Донати - Codidact.org
31
@LorenzoDonati это именно то, что вы должны сделать ... это очень простой ответ, потому что решение очень простое, и это просто другой способ сделать это, чем ответы выше. Кроме того, ответы не могут быть «слишком короткими», если они не отвечают на вопрос, ИМО.
Майкл Яворский
1
Извините, но это не то, что думает сообщество SO по этому поводу. Ответы не должны быть ограничены для решения проблемы ОП, они должны быть отличными ответами в целом. Посмотрите это и это , например.
Лоренцо Донати - Codidact.org
22
@LorenzoDonati - это очень специфический вопрос с одним конечным результатом (но несколькими способами его решения). Мой ответ является дополнением к другим ответам на этой странице. ВСЕ ответы на этой странице ограничены только «проблемой ОП», потому что это единственный вид ответа, который можно написать. Как я уже сказал, это конкретно и просто.
Майкл Яворский
2
наконец я нашел ответ. большое спасибо @mike yaworski
Drx
53

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

editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Абдо
источник
37

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

ridoy
источник
1
хороший и лучший подход к написанию в XML. Работает для меня. Спасибо
Ахесанали Сутар
1
Обратите внимание, что в документации для IME_FLAG_NO_EXTRACT_UI, которая соответствует flagNoExtractUiэтому, говорится, что «Использование этого флага не рекомендуется, и он может устареть в будущем», поэтому flagNoFullscreenэто рекомендуемый вариант.
ThomasW
12

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

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

editText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Максим Анселин
источник
9

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

@Override
public void onUpdateExtractingVisibility(EditorInfo ei) {
    ei.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
    super.onUpdateExtractingVisibility(ei);
}
ObsidianX
источник
6

Я знаю, что уже немного поздно, но для тех, кто все еще заинтересован, вот мое решение: в моем случае у меня была ландшафтная активность, содержащая 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"  />

Ура!

Арефе Ираванчи
источник
5

Мое решение:

android:imeOptions="flagNoExtractUi|flagNoFullscreen"
дастан
источник
Это более актуальный ответ.
alierdogan7
2

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

android:imeOptions="flagNoFullscreen" 

в вашем тексте редактирования

Thientvse
источник
1
Это ответ?
artgb
Я стараюсь, и это работает для меня! (Мое устройство Android 4.1.2)
Thientvse
0

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

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

super.clearFocus();
мохамед элагамия
источник