10

Podczas korzystania z AutoCompleteTextView pojawi się lista sugestii rozwijanych z nadal widoczną klawiaturą oprogramowania. Ma to sens, ponieważ często znacznie wydajniejsze jest wpisywanie kolejnych znaków w celu zawężenia listy.AutoCompleteTextView: Usuń miękką klawiaturę z tyłu naciśnij zamiast sugestii

Ale jeśli użytkownik chce nawigować po liście sugestii, staje się bardzo uciążliwy, gdy klawiatura oprogramowania jest nadal w ruchu (jest to jeszcze większy problem, gdy urządzenie znajduje się w orientacji poziomej). Poruszanie się po liście jest o wiele łatwiejsze, gdy klawiatura nie zajmuje miejsca na ekranie. Niestety domyślne zachowanie usuwa listę najpierw po naciśnięciu klawisza "wstecz" (mimo że w wersjach oprogramowania klawisza "wstecz" jest wyświetlany obraz z napisem "naciśnięcie tego spowoduje ukrycie klawiatury").

Oto Barebone przykład, który pokazuje, co mówię:

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); 
    } 
} 

Poza faktem, że jest nieintuicyjne (tył wskazówkę klucz sugeruje, że tylna naciśnij zostanie wysłany na klawiaturze) sprawia, że ​​poruszanie się po nim jest niezwykle męczące.

Jaki jest najmniej nachalny sposób (np łapanie tyłu w dniu onBackPressed() w każdej działalności i routing go odpowiednio na pewno nie będzie idealny), aby pierwszy z powrotem prasa ukryć klawiaturę, a drugi usunąć listę podpowiedzi ?

Odpowiedz

22

Można to osiągnąć, zastępując onKeyPreIme w niestandardowym 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

dobre rozwiązanie, ale nie wydają się działać. Klucz jest poprawnie chwytany i rozpoznawany (to znaczy wywoływany jest hideSoftInputFromWindow), ale klawiatura faktycznie nie znika. Czy może się zderzyć z czymś w "EditText", który utrzymuje klawiaturę, gdy widok jest ostry? –

+0

Czy możesz spróbować getApplicationWindowToken() zamiast –

+0

Ten sam wynik nadal niestety –

2

ustawić DismissClickListener jak ten

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

Działa to tylko po wpisie API17. Jakieś rozwiązanie dla API <17? Dzięki. –

Powiązane problemy