10

Quando si utilizza AutoCompleteTextView, l'elenco di suggerimenti a discesa viene visualizzato con la tastiera software ancora visibile. Questo ha senso, dato che è spesso molto più efficiente digitare caratteri successivi per restringere la lista.AutoCompleteTextView: Rimuovi la tastiera virtuale nella stampa posteriore invece dei suggerimenti

Ma se l'utente desidera navigare nell'elenco dei suggerimenti, diventa estremamente noioso con la tastiera del software ancora attiva (questo è ancora più un problema quando il dispositivo è in orientamento orizzontale). La navigazione nell'elenco è molto più semplice senza la tastiera che si occupa dello spazio sullo schermo. Sfortunatamente, il comportamento predefinito rimuove l'elenco per primo quando si preme il tasto indietro (anche se nelle versioni software del tasto Indietro viene visualizzata l'immagine che dice 'premendo per nascondere la tastiera').

Ecco un esempio barebone che dimostra di cosa sto parlando:

public class Main2 extends Activity { 
    private static final String[] items = { 
      "One", 
      "Two", 
      "Three", 
      "Four", 
      "Five" 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     AutoCompleteTextView actv = new AutoCompleteTextView(this); 
     actv.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
     actv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items)); 
     actv.setThreshold(1); 

     LinearLayout ll = new LinearLayout(this); 
     ll.setOrientation(LinearLayout.VERTICAL); 
     ll.addView(actv); 

     setContentView(ll); 
    } 
} 

Oltre al fatto che questo è poco intuitivo (il suggerimento tasto Indietro sta suggerendo che la stampa di nuovo verrà inviato alla tastiera), rende estremamente fastidiosa la navigazione dei suggerimenti AutoCompleteTextView.

Qual è la almeno modo invadente (per esempio, la cattura la schiena in su onBackPressed() in ogni attività e di routing di conseguenza non sarebbe sicuramente ideale) a fare la prima stampa di nuovo nascondere la tastiera, e il secondo rimuovere l'elenco suggerimento ?

risposta

22

È possibile ottenere ciò sostituendo onKeyPreIme nella vostra dogana AutoCompleteTextView.

public class CustomAutoCompleteTextView extends AutoCompleteTextView { 

     public CustomAutoCompleteTextView(Context context) { 
      super(context); 
     } 

     public CustomAutoCompleteTextView(Context context, AttributeSet attrs) { 
      super(context, attrs); 
     } 

     public CustomAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { 
      super(context, attrs, defStyleAttr); 
     } 

     @Override 
     public boolean onKeyPreIme(int keyCode, KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_BACK && isPopupShowing()) { 
       InputMethodManager inputManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 

       if(inputManager.hideSoftInputFromWindow(findFocus().getWindowToken(), 
        InputMethodManager.HIDE_NOT_ALWAYS)){  
        return true; 
       } 
      } 

      return super.onKeyPreIme(keyCode, event); 
     } 

    } 
+0

buona soluzione, ma non sembra funzionare. La chiave è correttamente acquisita e riconosciuta (ad esempio hideSoftInputFromWindow viene attivata) ma la tastiera non scompare. Potrebbe essere in conflitto con qualcosa in "EditText" che mantiene la tastiera morbida in alto mentre la vista è attiva? –

+0

Puoi provare getApplicationWindowToken() invece –

+0

Lo stesso risultato è ancora sfortunatamente –

2

set DismissClickListener come questo

autoCompleteTextView.setOnDismissListener(new AutoCompleteTextView.OnDismissListener() { 
      @Override 
      public void onDismiss() { 
       InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
       in.hideSoftInputFromWindow(getCurrentFocus().getApplicationWindowToken(), 0); 
      } 
     }); 
+0

Funziona solo dopo il post API17. Qualche soluzione per l'API <17? Grazie. –

Problemi correlati