webentwicklung-frage-antwort-db.com.de

Wie kann ich eine SearchView programmgesteuert schließen?

Ich habe derzeit eine SearchView in der Aktionsleiste meiner App. Wenn ich auf das Suchsymbol klicke, wird die Variable SearchView erweitert und die Tastatur wird erwartungsgemäß angezeigt. Durch Klicken auf das "X" im Feld SearchView wird die SearchView wie erwartet geschlossen. Wenn jedoch die SearchView aktiviert ist und ich die "Zurück" -Taste drücke, wird meine App beendet. Dies ist das richtige Verhalten, aber ich versuche jetzt, den Zurückdrücken-Knopfdruck zu erfassen und die SearchView (nicht meine App) schließen zu lassen, wenn die SearchView sichtbar ist. Gibt es eine Möglichkeit, die SearchViewOnCloseListener() programmgesteuert durch Drücken der Zurück-Taste aufzurufen? Zum Beispiel so etwas:

// 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);
}
55
Tim

Basierend auf der Antwort von @MarcinOrlowski können Sie auch verwenden

@Override
public void onBackPressed() {
    if (!searchView.isIconified()) {
        searchView.setIconified(true);
    } else {
        super.onBackPressed();
    }
}
126
Mohsen Afshin

Benutzen

searchView.setIconified(true)

Ich habe auch MenuItemCompat.collapseActionView verwendet

MenuItemCompat.collapseActionView(menuItem)
45
betorcs

Es gibt einen einfachen Weg, dies zu tun:

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

oder verwenden Sie:

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

Dadurch wird die Suchansicht reduziert, bevor Sie auf die Rücktaste drücken. Dann wird die Zurück-Aktion aufgerufen.

Beide Lösungen funktionieren.

31
blueware

dies ist das einzige, was es für mich tut:

  toolbar.collapseActionView();
26
raklos

Um die BACK-Schaltfläche außer Kraft zu setzen, onBackPressed() ( siehe 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 sagen :

Bei Bedarf können Sie die Aktionsansicht in Ihrer eigenen Ansicht erweitern oder reduzieren Code durch Aufrufen von expandActionView () und collapseActionView () für die MenuItem.

22
Marcin Orlowski

wenn Sie in Ihrem searchView Eingaben gemacht haben

mSearchView.setIconified(true);

löscht nur den Text.

Die korrekte Methode zum Schließen einer Suchansicht ist

mSearchView.onActionViewCollapsed();
12
DoruChidean

Benutzen:

searchView.setIconified(true);
2
Alex

Ich bevorzuge !searchView.isIconified() über if(isSearchViewVisible) innerhalb der onBackPressed()-Methode, da Option 2 nicht funktioniert, wenn in Ihrem fragmentmanager'sbackstack Fragmente hinzugefügt wurden, die Sie anzeigen möchten, wenn die Zurück-Taste gedrückt wird.

2
Codedroid

Keine Notwendigkeit, onBackPressed()-Methode dafür zu verwenden !! Ich habe die Lösung gefunden, mache nur das, was ich unten erwähnt habe, damit der SearchView selbst den auf den Zurück-Knopf drückt event.

In Ihrer onCreateOptionsMenu()-Methode 

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    MenuItem menuItem = menu.findItem(R.id.action_search);
    SearchView searchview = (SearchView) menuItem.getActionView();
    searchview.setIconifiedByDefault(true);
    searchview.setQueryHint("Enter your keyword");
    searchview.setOnQueryTextListener(this); 
    super.onCreateOptionsMenu(menu, inflater);
}

In Ihrem menu.xml add showAsAction -Attribut und setzen Sie seine Werte als "always|collapseActionView"

<item
    Android:id="@+id/action_search_item"
    Android:title="Search"
    Android:icon="@drawable/ic_search_logo"
    app:showAsAction="always|collapseActionView"
    app:actionViewClass="Android.support.v7.widget.SearchView"/>

Und du bist bereit zu gehen;)

P.S. - Ich habe schon lange nach einer Lösung gesucht und jetzt habe ich eine gefunden. Ich hoffe, es hilft Ihnen allen.

0
codervishal

Sie können auch collapseActionView verwenden. Es behandelt automatisch die Zurück-Taste und reduziert 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" />
0
Deni Erdyneev

Wenn Sie keine Funktion in der onBackPressed()-Methode verwenden, entfernen Sie sie aus Ihrer Activity.So, dass die SearchView selbst das onBackPress-Ereignis behandelt.

Ich benutze SearchView als

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

und meine menu.xml wie folgt

<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"/>
0
SachinS

Auf meine Art:

  1. Erstellen Sie die CustomSearchView-Klasse
 Die öffentliche Klasse CustomSearchView erweitert SearchView {
 public CustomSearchView (Endgültiger Kontext) {
 super (Kontext); 
 this.setIconifiedByDefault (true); 
 } 

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

  1. Fügen Sie actionViewClass hinzu
 <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. Erstellen Sie CustomSearchView in onCreateOptionsMenu 
 CustomSearchView searchView = (CustomSearchView) menu.findItem (R.id.menu_search) .getActionView (); 
0
Sergei K