Disabilitare la visualizzazione di modifica a schermo intero per l'input da tastiera virtuale in orizzontale?


237

Sui dispositivi Android che utilizzano tastiere software, voglio impedire che la visualizzazione di modifica della tastiera a schermo intero (mostrata di seguito) appaia in modalità orizzontale (ovvero voglio vedere solo la tastiera software stessa e la mia vista dietro di essa).

Presumo che ciò possa essere ottenuto utilizzando il setExtractViewShown(false)metodo on InputMethodService, ma non sono in grado di accedere all'istanza predefinita di questo e non voglio implementare un metodo di input personalizzato.

Vista di modifica a schermo intero Android

Modificato per aggiungere: la vista a cui sta andando l'input non è una TextView(è una Viewcon InputConnectionun'implementazione personalizzata ), quindi android:imeOptions="flagNoExtractUi"non funzionerà qui.


Proviamo a vederlo. È buono per te. [Guardate a questo] [1] [1]: stackoverflow.com/questions/8648401/...
sonida

Ho un problema simile :( si potrebbe avere qualche idea? stackoverflow.com/questions/36914290/...
railwanderer

2
come applicarlo in tutta l'app. Non aggiungeremo l'attributo-valore in ogni edittext in xml.
Vikas Pandey,

2
Molte delle risposte seguenti raccomandano di usare flagNoExtractUio IME_FLAG_NO_EXTRACT_UI. Tuttavia, nella documentazione per IME_FLAG_NO_EXTRACT_UI, che corrisponde a flagNoExtractUi, si afferma che "L'uso di questo flag è scoraggiato e potrebbe diventare deprecato in futuro", quindi flagNoFullscreenè l'opzione consigliata.
ThomasW,

Risposte:


178

Alla fine ho risposto alla mia domanda:

L'interfaccia utente di estrazione (ovvero la modalità di modifica a schermo intero) può essere disabilitata nel punto in cui è collegata la connessione di ingresso:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

    outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;

    // etc.
}

215
inserisci semplicemente il tuo file xml android: imeOptions = "flagNoExtractUi"

1
jnic, dove hai fatto questo override nel codice della tastiera soft? SoftKeyboard.java? Ho provato la stessa sostituzione e ho eliminato l'errore.

14
Probabilmente vorrai aggiungere il flag alle opzioni invece di sovrascrivere qualsiasi opzione venga passata in questo modo:outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
ObsidianX

2
@ user726518 come applicare questo attributo sull'elemento della casella di ricerca nella barra delle azioni?
Menna-Allah Sami,

1
L'unica cosa ha funzionato quando si utilizza la visualizzazione personalizzata per gestire la tastiera. Grazie!
Herman,

109

Per farlo, vai all'attività xml e incolla il android:imeOptions="flagNoExtractUi"tuo codice. Ma dove dovrebbe essere incollato? Dai un'occhiata al codice di esempio attività xml e guarda 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 desideri ulteriori opzioni di personalizzazione per la tastiera, consulta http://developer.android.com/guide/topics/ui/controls/text.html


64

aggiungi la proprietà android:imeOptions="flagNoExtractUi"a ciascuna EditTextnel tuo XMLfile.


1
Questa risposta è troppo breve e non soddisfa gli standard di qualità SO. Miglioralo aggiungendo alcune spiegazioni aggiuntive, in modo che sia utile per la comunità e non solo per il PO.
Lorenzo Donati - Codidact.org

31
@LorenzoDonati è esattamente quello che devi fare ... è una risposta molto semplice perché la soluzione è molto semplice ed è solo un modo diverso di farlo rispetto alle risposte sopra. Inoltre, le risposte non possono essere "troppo brevi" a meno che non rispondano alla domanda, IMO.
Michael Yaworski,

1
Siamo spiacenti, ma questo non è ciò che la comunità SO ci pensa. Le risposte non dovrebbero essere limitate per risolvere il problema del PO, dovrebbero essere ottime risposte in generale. Vedi questo e questo , per esempio.
Lorenzo Donati - Codidact.org,

22
@LorenzoDonati è una domanda molto specifica con un solo risultato finale (ma molteplici modi per risolverlo). La mia risposta è un'aggiunta alle altre risposte in questa pagina. TUTTE le risposte in questa pagina sono limitate al "problema del PO" perché è l'unico tipo di risposta che può essere scritta. Come ho detto, è specifico e semplice.
Michael Yaworski,

2
finalmente ho trovato la risposta. grazie mille @mike yaworski
Drx,

53

La risposta sopra mi ha aiutato a capire la soluzione per EditTexts aggiunti dinamicamente:

editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);

37

Utilizzare android:imeOptions="flagNoFullscreen"per ottenere quella funzione.


1
approccio piacevole e migliore per scrivere in XML. Per me va bene. Grazie
Ahesanali Suthar,

1
Si noti che nella documentazione per IME_FLAG_NO_EXTRACT_UI, che corrisponde a flagNoExtractUi, si afferma che "L'uso di questo flag è scoraggiato e potrebbe diventare deprecato in futuro", quindi flagNoFullscreenè l'opzione consigliata.
ThomasW,

12

Inoltre, se si desidera combinare più imeOptions in modo programmatico, è possibile utilizzare | sintassi.

Ad esempio, per disabilitare la vista di modifica a schermo intero in orizzontale e sostituire il tasto "Avanti" con "OK" (ACTION_DONE) sulla tastiera, è possibile utilizzare:

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

9

Se stai modificando l'IME direttamente, puoi impedirgli di visualizzare mai un ExtractedView sostituendo onUpdateExtractingVisibility:

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

6

So che è un po 'tardi, ma per chi è ancora interessato, qui è la mia soluzione: Nel mio caso ho avuto un paesaggio Activity contenente un ModificaIlTesto in cima esso e avevo bisogno di implementare completamento automatico funzionalità di questa ricerca di attività , che la sovrapposizione la tastiera ha causato un problema che l'utente non poteva vedere il risultato di RecyclerView . Così ho finito con questo EditText nel mio layout:

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

Saluti!


5

La mia soluzione:

android:imeOptions="flagNoExtractUi|flagNoFullscreen"

Questa è una risposta più aggiornata.
alierdogan7,

2

Puoi usare :

android:imeOptions="flagNoFullscreen" 

nel tuo edittext


1
Questa è una risposta?
artgb,

Lo provo e funziona per me! (Il mio dispositivo è Android 4.1.2)
Thientvse,

0

È possibile chiamare per nascondere la tastiera virtuale e deselezionare lo stato attivo dalla ricerca.

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

super.clearFocus();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.