2013-07-11 7 views
7

W mojej aplikacji robię search interface, w której SearchView zwija się i rozszerza, gdy traci i zyskuje odpowiednio. Jednak przegrana ostrości rzecz dzieje się tylko w dwóch przypadkach:Jak sprawić, by SearchView utracił fokus i zwinął się, gdy kliknął gdzie indziej na aktywność

  1. Kiedy przycisk jest wciśnięty z powrotem.

  2. Po naciśnięciu ikony domowej obok przycisku SearchView.

chcę go stracić ostrość (i stąd zwinąć), jeśli użytkownik kliknie nie tylko na tych dwóch rzeczy, ale nigdzie indziej na ekranie (np dowolny przycisk lub dowolny pusty fragment ekranu bez widoku na tym).

Odpowiedz

8

Cóż, znalazłem następujące rozwiązanie. Użyłem setOnTouchListener w każdym widoku, który nie jest instancją wyszukiwania, aby zwinąć widok wyszukiwania. To zadziałało idealnie dla mnie. Poniżej znajduje się kod.

public void setupUI(View view) { 

    if(!(view instanceof SearchView)) { 

     view.setOnTouchListener(new OnTouchListener() { 

      public boolean onTouch(View v, MotionEvent event) { 
       searchMenuItem.collapseActionView(); 
       return false; 
      } 

     }); 
    } 

    //If a layout container, iterate over children and seed recursion. 
    if (view instanceof ViewGroup) { 

     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 

      View innerView = ((ViewGroup) view).getChildAt(i); 

      setupUI(innerView); 
     } 
    } 
} 

This jest odpowiedzią I, o którym mowa.

+0

Wielki, odpowiedź jest przydatna, ale teraz przyjmuję je;)! – JJ86

+1

Ustawiasz odbiornik dotyku dla każdego widoku w hierarchii oprócz widoku wyszukiwania? Co jeśli mają już słuchaczy dotykowych? – alexbirkett

0

Działa to dla mnie mOptionsMenu zostanie zapisany w onCreateOptionsMenu:

public void setupUI(View view) { 

    //Set up touch listener for non-text box views to hide keyboard. 
    if(!(view instanceof EditText)) { 

     view.setOnTouchListener(new View.OnTouchListener() { 

      public boolean onTouch(View v, MotionEvent event) { 
       hideSoftKeyboard(MainActivity.this); 
       if(mOptionsMenu == null) return false; 
       MenuItem searchMenuItem = mOptionsMenu.findItem(R.id.action_search); 
       if(searchMenuItem == null) return false; 
       ((SearchView)searchMenuItem.getActionView()).clearFocus(); 
       return false; 
      } 

     }); 
    } 

    //If a layout container, iterate over children and seed recursion. 
    if (view instanceof ViewGroup) { 

     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 

      View innerView = ((ViewGroup) view).getChildAt(i); 

      setupUI(innerView); 
     } 
    } 
} 

public static void hideSoftKeyboard(Activity activity) { 
    InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); 
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); 
} 
Powiązane problemy