2015-07-16 17 views
9

Sto tentando di evitare la modifica della tastiera a schermo intero in orizzontale per poter accedere ai suggerimenti.C'è un modo per evitare la visualizzazione a schermo intero di SearchView/Keyboard in orizzontale?

ho già letto un sacco di discussioni che spiegano che devo aggiungere bandiere EditorInfo come flagNoFullscreen e/o flagNoExtractUi.

L'ho aggiunto a livello di codice ma non molto utile.

C'è un modo per capirlo?

+1

Possibile duplicato di http://stackoverflow.com/questions/4336762/disabling-the-fullscreen-editing-view-for-soft-keyboard-input-in-landscape – yahya

+0

Sto usando una searchview programmaticamente. Non posso invocare onCreateInputConnection e i flag EditorInfo non sono utili – 13KZ

risposta

19

Mi ci è voluto un po 'per capire questo, ma in realtà è piuttosto semplice.

Inizialmente ho creato una classe personalizzata che estendeva la classe SearchView e utilizzato un override onCreateInputConnection(), tuttavia non riuscivo a farlo funzionare in questo modo.

Alla fine ho funzionato in un modo molto più semplice, con solo due linee di codice aggiunte.

Hai solo bisogno di chiamare search.getImeOptions() per ottenere la configurazione corrente, e poi "o" il risultato con EditorInfo.IME_FLAG_NO_EXTRACT_UI con una chiamata a setImeOptions():

search.setImeOptions(options|EditorInfo.IME_FLAG_NO_EXTRACT_UI); 

Se non lo fai "o" con le opzioni esistenti , quindi non si ottiene il pulsante di completamento "Cerca" in basso a destra, si ottiene invece un pulsante "Fatto".

Ecco il pieno onCreateOptionsMenu() di override che ho usato per testare (io ho usato un SearchView nel xml, ma questa soluzione dovrebbe funzionare per voi anche se non stai gonfiare il tuo SearchView da XML):

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.menu_main, menu); 

    SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 

    SearchView search = (SearchView) menu.findItem(R.id.action_search).getActionView(); 

    SearchableInfo si = manager.getSearchableInfo(getComponentName()); 

    //Here is where the magic happens: 
    int options = search.getImeOptions(); 
    search.setImeOptions(options|EditorInfo.IME_FLAG_NO_EXTRACT_UI); 
    //!!!!!!!!!!! 

    search.setSearchableInfo(si); 

    search.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 

     @Override 
     public boolean onQueryTextSubmit(String query) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String query) { 
      return true; 
     } 

    }); 
    return true; 
} 

Ecco l'xml che ho usato per la SearchView in menu_main.xml:

<item android:id="@+id/action_search" 
     android:title="Search" 
     android:icon="@android:drawable/ic_menu_search" 
     app:showAsAction="always" 
     app:actionViewClass="android.support.v7.widget.SearchView" 
     /> 

risultato senza la chiamata a setImeOptions():

Before

Risultato con la chiamata a setImeOptions():

enter image description here

+1

Questa soluzione funziona per me. Grazie mille @ Daniel. – 13KZ

0

Un'altra alternativa per il codice è quello di aggiungere la proprietà nel xml SearchView, è utile per le API meno di 16:

<SearchView 
    android:imeOptions="flagNoExtractUi" />