2013-07-06 16 views
48

Attualmente ho un SearchView nella barra delle azioni della mia app. Quando faccio clic sull'icona di ricerca, SearchView si espande e la tastiera si apre come previsto. Facendo clic su "X" nella casella SearchView si chiude SearchView come previsto. Tuttavia, quando SearchView è attivato e premo il pulsante "indietro", la mia app è chiusa. Questo è il comportamento corretto, ma quello che sto cercando di fare ora è quello di catturare il pulsante indietro e basta chiudere SearchView (non la mia app) quando SearchView è visibile. C'è un modo per richiamare SearchView OnCloseListener() a livello di codice su un pulsante indietro premere? Per esempio, qualcosa di simile:Come si chiude un SearchView al livello di programmazione?

// On a back button press, if we are currently searching, 
// close the SearchView. Otherwise, invoke normal back button 
// behavior. 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     if (isSearchViewVisible) { 
      SearchView searchView = (SearchView) menu.findItem(R.id.searchBox) 
       .getActionView(); 

      // This method does not exist 
      searchView.invokeClose(); 
      return true; 
     } 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+0

https://stackoverflow.com/a/46930606/1308990 – oiyio

risposta

102

Sulla base di @MarcinOrlowski risposta, inoltre è possibile utilizzare:

@Override 
public void onBackPressed() { 
    if (!searchView.isIconified()) { 
     searchView.setIconified(true); 
    } else { 
     super.onBackPressed(); 
    } 
} 
+1

dovrebbe essere contrassegnato come risposta corretta –

+2

Importante, la soluzione di cui sopra non funzionerà se hai impostato app: showAsAction = "always" – UserK

+2

Assicurati di impostare searchView.setQuery ("", false); per rendere searchView.setIconified (true); per funzionare – Pushan

21

di intercettare INDIETRO pulsante di esclusione onBackPressed() (see docs)

@Override 
public void onBackPressed() { 

    if (isSearchViewVisible) { 
     SearchView searchView = (SearchView) menu.findItem(R.id.searchBox) 
      .getActionView(); 

     // This method does not exist 
     searchView.invokeClose(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

EDIT:

Docs say:

Se necessario, è può espandere o comprimere la vista di azione nel proprio codice chiamando expandActionView() e collapseActionView() sul MenuItem .

+0

Grazie per la risposta! Ciò a cui sono principalmente interessato è se esiste un modo per richiamare a livello di codice un evento di chiusura di SearchView, ad esempio Imitare un pulsante "X" nella finestra di SearchView. – Tim

+0

Vedi risposta modificata –

+2

Grazie per tutto l'aiuto Marcin. Si scopre che quello che volevo veramente fare era "iconificare" la mia actionview di ricerca (la mia searchview è sempre sulla barra delle azioni e non collassa mai nel menu delle opzioni). Grazie per aver dedicato del tempo per aiutarmi e grazie per il suggerimento su "OverBackPressed". – Tim

1

preferisco searchView.isIconified() oltre se il metodo (isSearchViewVisible) all'interno del onBackPressed() in opzione 2 fa! non funziona quando hai aggiunto dei frammenti nel backstack del tuo frammentmanager che vorresti mostrare quando viene premuto il pulsante Indietro.

24

C'è un modo semplice per farlo:

@Override 
public void onBackPressed() { 
    if (!searchView.isIconified()) { 
     searchView.onActionViewCollapsed(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

o l'uso:

@Override 
public void onBackPressed() { 
    searchView.onActionViewCollapsed(); 
    super.onBackPressed(); 
} 

Ciò farà sì che il searchView crolli prima di premere il retro, quindi verrà richiamata l'azione back.

Entrambe le soluzioni funzioneranno.

2

Usa:

searchView.setIconified(true); 
0

Il mio modo:

  1. Crea classe CustomSearchView
 

    public class CustomSearchView extends SearchView{ 
     public CustomSearchView(final Context context) { 
      super(context); 
      this.setIconifiedByDefault(true); 
     } 

     @Override 
     public boolean dispatchKeyEventPreIme(KeyEvent event) { 
      if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && 
       event.getAction() == KeyEvent.ACTION_UP) { 
       this.onActionViewCollapsed(); 
      } 
      return super.dispatchKeyEventPreIme(event); 
     } 
    } 

  1. Aggiungi actionViewClass
 
    <item 
     android:id="@+id/menu_search" 
     android:title="@string/menu_search" 
     android:icon="@drawable/ic_search" 
     android:showAsAction="collapseActionView|ifRoom" 
     android:actionViewClass="com.myapp.CustomSearchView"/> 
  1. Crea CustomSearchView in onCreateOptionsMenu
 
    CustomSearchView searchView = (CustomSearchView)menu.findItem(R.id.menu_search).getActionView(); 
0

Se non si utilizza qualsiasi funzione nel onBackPressed() metodo, rimuoverla dal Activity.So che la stessa SearchView gestire l'evento onBackPress.

Sto usando SearchView come

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    MenuItem searchItem = menu.findItem(R.id.action_search); 
    SearchView searchview = (SearchView) MenuItemCompat.getActionView(searchItem); 
    searchview.setIconifiedByDefault(true); 
    searchview.setOnQueryTextListener(this); 
    searchview.setSubmitButtonEnabled(true); 
    searchview.setQueryHint("Search Here"); 
    super.onCreateOptionsMenu(menu, inflater); 
} 

e la mia menu.xml come segue

<item 
    android:id="@+id/action_search" 
    android:icon="@drawable/search_tool" 
    android:orderInCategory="1" 
    android:title="Search" 
    app:actionViewClass="android.support.v7.widget.SearchView" 
    app:showAsAction="always|collapseActionView"/> 
16

questa è l'unica cosa che fa per me:

toolbar.collapseActionView(); 
+1

Soluzione discreta –

+1

Ho provato tutte le soluzioni in questo thread. questa soluzione è la migliore per me. è l'unica soluzione che ha riportato l'icona di ricerca sullo schermo in alto a destra – Dika

0

Inoltre è possibile utilizzare collapseActionView. Esso gestisce automaticamente pulsante, crollando SearchView

<item 
     android:id="@+id/action_search" 
     android:icon="@drawable/ic_magnify" 
     android:title="@string/action_title_search" 
     app:actionViewClass="android.support.v7.widget.SearchView" 
     app:showAsAction="ifRoom|collapseActionView" /> 
6

se si dispone di ingresso sul SearchView

mSearchView.setIconified(true); 

servirà solo a cancellare il testo.

Il metodo corretto per chiudere un SearchView è

mSearchView.onActionViewCollapsed(); 
Problemi correlati