Desativando a visualização de edição em tela cheia para entrada do teclado virtual em modo paisagem?

237

Em dispositivos Android que usam teclados programáveis, quero impedir que a exibição de edição do teclado em tela cheia (mostrada abaixo) apareça no modo paisagem (ou seja, quero ver apenas o próprio teclado virtual e a minha visão por trás dele).

Presumo que isso possa ser alcançado usando o setExtractViewShown(false)método on InputMethodService, mas não consigo acessar a instância padrão disso e não quero implementar um método de entrada personalizado.

Visualização de edição em tela cheia do Android

Editado para adicionar: a visualização para a qual a entrada está indo não é uma TextView(é uma Viewcom uma InputConnectionimplementação personalizada ), portanto android:imeOptions="flagNoExtractUi", não funcionará aqui.

jnic
fonte
Vamos tentar ver. É bom para você. [Veja esta] [1] [1]: stackoverflow.com/questions/8648401/…
sonida
Eu tenho um problema semelhante :( você pode ter alguma idéia? stackoverflow.com/questions/36914290/...
railwanderer
2
como aplicar isso em todo o aplicativo. Não adicionaremos o valor do atributo em cada edittext em xml.
Vikas Pandey
2
Muitas das respostas abaixo recomendam o uso de flagNoExtractUiou IME_FLAG_NO_EXTRACT_UI. No entanto, na documentação referente a IME_FLAG_NO_EXTRACT_UI, que corresponde a flagNoExtractUi, afirma que "O uso desse sinalizador é desencorajado e pode ficar obsoleto no futuro", assim flagNoFullscreencomo a opção recomendada.
Thomasw

Respostas:

178

Eu finalmente respondi minha própria pergunta:

A interface do usuário de extração (ou seja, o modo de edição em tela cheia) pode ser desativada no ponto em que a conexão de entrada está conectada:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

    outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;

    // etc.
}
jnic
fonte
215
basta colocar no seu arquivo xml android: imeOptions = "flagNoExtractUi"
1
jnic, onde você substituiu isso no código do teclado virtual? SoftKeyboard.java? Tentei a mesma substituição e erro.
14
Você provavelmente desejará adicionar o sinalizador às opções em vez de substituir as opções que estavam sendo passadas dessa maneira:outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
ObsidianX
2
@ user726518 como aplicar este atributo no item da caixa de pesquisa na barra de ação?
Menna-Allah Sami
1
A única coisa que funcionou ao usar o View personalizado para lidar com o teclado. Obrigado!
Herman
109

Para fazer isso, navegue até a atividade xml e cole android:imeOptions="flagNoExtractUi"no seu código. Mas onde deve ser colado? Veja o código do exemplo de atividade xml e veja 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>

Se você quiser mais opções de personalização para o teclado, consulte http://developer.android.com/guide/topics/ui/controls/text.html

pbaranski
fonte
64

adicione a propriedade android:imeOptions="flagNoExtractUi"a cada um EditTextno seu XMLarquivo.

Michael Yaworski
fonte
1
Esta resposta é muito curta e não atende aos padrões de qualidade do SO. Melhore-o adicionando algumas explicações adicionais, para que seja útil para a comunidade e não apenas para o OP.
Lorenzo Donati - Codidact.org
31
@LorenzoDonati, é exatamente o que você precisa fazer ... é uma resposta muito simples, porque a solução é muito simples e é apenas uma maneira diferente de fazê-lo do que as respostas acima. Além disso, as respostas não podem ser "muito curtas", a menos que não respondam à pergunta, IMO.
22813 Michael Yaworski #
1
Desculpe, mas não é isso que a comunidade SO pensa sobre isso. As respostas não devem ser limitadas para resolver o problema do OP, mas devem ser ótimas respostas em geral. Veja isso e isso , por exemplo.
Lorenzo Donati - Codidact.org
22
@LorenzoDonati, é uma pergunta muito específica, com apenas um resultado final (mas várias maneiras de resolvê-lo). Minha resposta é uma adição às outras respostas nesta página. TODAS as respostas nesta página são limitadas apenas ao "problema do OP", porque esse é o único tipo de resposta que pode ser escrito. Como eu disse, é específico e simples.
Michael Yaworski
2
finalmente, encontrei a resposta. muito obrigado @mike yaworski
Drx
53

A resposta acima me ajudou a descobrir a solução para EditTexts adicionados dinamicamente:

editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Abdo
fonte
37

Use android:imeOptions="flagNoFullscreen"para alcançar esse recurso.

ridoy
fonte
1
abordagem agradável e melhor para escrever em xml. Funciona para mim. Obrigado
Ahesanali Suthar
1
Observe que na documentação referente a IME_FLAG_NO_EXTRACT_UI, que corresponde a flagNoExtractUi, afirma que "O uso desse sinalizador é desencorajado e pode ficar obsoleto no futuro", assim flagNoFullscreencomo a opção recomendada.
ThomasW 27/02/19
12

Além disso, se você quiser combinar várias imeOptions programaticamente, poderá usar o | sintaxe.

Por exemplo, para desativar a exibição de edição em tela cheia no modo paisagem e substituir a tecla "Avançar" por "OK" (ACTION_DONE) no teclado, você pode usar:

editText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Maxime Ancelin
fonte
9

Se você estiver modificando o IME diretamente, poderá impedir que ele exiba um ExtractedView substituindo onUpdateExtractingVisibility:

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

Eu sei que é um pouco tarde, mas para quem ainda está interessado, aqui está a minha solução: No meu caso, eu tinha uma Activity de paisagem contendo um EditText na parte superior e precisava implementar o recurso de preenchimento automático nesta atividade de pesquisa , que era a sobreposição teclado causou um problema que o usuário não pôde ver o resultado do RecyclerView . Então acabei tendo este EditText no meu layout:

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

Felicidades!

Arefeh Iravanchi
fonte
5

Minha solução:

android:imeOptions="flagNoExtractUi|flagNoFullscreen"
dastan
fonte
Esta é uma resposta mais atualizada.
alierdogan7
2

Você pode usar :

android:imeOptions="flagNoFullscreen" 

no seu edittext

Thientvse
fonte
1
Isso é uma resposta?
Art21
Eu tento e funciona para mim! (Meu dispositivo é o Android 4.1.2)
Thientvse 27/09
0

Você pode ligar para ocultar o teclado virtual e focar claramente no visor de pesquisa.

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

super.clearFocus();
elagamia de mohamed
fonte