android - Auto Collapse ActionBar SearchView auf der weichen Tastatur schließen




android-actionbar android-softkeyboard (10)

Ich verwende derzeit einen ActionBar-Menüeintrag, um in der Aktionsleiste ein SearchView anzuzeigen. Wenn der Suchmenüpunkt erweitert wird, wird die Soft-Tastatur angezeigt, was ich möchte. Jetzt, wenn der Benutzer die Zurück-Taste drückt, um die Soft-Tastatur zu schließen, möchte ich auch die SearchView in der Aktionsleiste ausblenden.

Ich habe versucht, die folgenden Listener OnKeyListener und OnFocusChangeListener auf dem MenuItem und dem ActionView zu implementieren. Ich habe auch versucht, OnBackPressed () in der Aktivität zu verwenden. Keine der oben genannten Funktionen erkennt, wenn die Zurück-Taste zum Schließen der Soft-Tastatur verwendet wird.

Irgendwelche Ideen?

Ich habe OnActionExpandListener implementiert, um zu wissen, wann das SearchView sichtbar ist.


Answers

Das habe ich getan, um die Tastatur verschwinden zu lassen. Sie können versuchen, ob das für Sie funktioniert. Ich setze die searchView auf unsichtbar und dann wieder auf sichtbar.

    //set query change listener
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
        @Override
        public boolean onQueryTextChange(String newText) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean onQueryTextSubmit(String query) {
            /**
             * hides and then unhides search tab to make sure keyboard disappears when query is submitted
             */
                  searchView.setVisibility(View.INVISIBLE);
                  searchView.setVisibility(View.VISIBLE);
            return false;
        }

     });

Sie müssen nur das Attribut "collapseActionView" im Menülayout platzieren

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_item_search"
        android:title="@string/search"
        android:iconifiedByDefault="true"
        android:icon="@drawable/ic_action_search" 
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom|collapseActionView"/> <--this one
</menu>

Das gibt Ihnen die Funktionalität, nach der Sie selbst suchen. Vergessen Sie nicht, die Methode "clearFocus" auf dem SearchView aufzurufen, um die Tastatur zu schließen, sobald Sie die Abfrage gesendet haben.


Ich habe eine bessere Lösung gefunden.

searchView.setOnQueryTextFocusChangeListener(). 

Der OnQueryTextFocusChangeListener wird aufgerufen, wenn die Tastatur ein- oder ausgeblendet wird. Wird zuerst aufgerufen, wenn die Tastatur angezeigt wird und die Suchansicht den Fokus hat. Wird erneut aufgerufen, wenn die keyboard ausgeblendet ist und die Suchansicht den Fokus verliert, kann die close search view dann schließen

menuItem.collapseActionView().

Überbrücken Sie OnBackPressed einfach so:

@Override
    public void onBackPressed() {
        if (searchView.isShown()){
            searchView.onActionViewCollapsed();  //collapse your ActionView
            searchView.setQuery("",false);       //clears your query without submit
            isClosed = true;                     //needed to handle closed by back
        } else{
            super.onBackPressed();
        }
    }

und Ihr onCreateOptionsMenu würde die mSearchView wie folgt aufblasen:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu_search, menu);
        mSearchView = (SearchView) menu.findItem(R.id.menu_action_search).getActionView();
        mSearchView.setOnQueryTextListener(this);
        mSearchView.setOnSearchClickListener(this);
        mSearchView.setOnCloseListener(this);
        isClosed = true;
        return true;
    }

Haben Sie Klasse wie folgt implementieren:

public class myActivity extends FragmentActivity implements
    SearchView.OnQueryTextListener, View.OnClickListener, SearchView.OnCloseListener {

was du auch brauchst:

@Override
public void onClick(View view) {
    isClosed = false;
}

@Override
public boolean onClose() {
    isClosed = true;
    return false;
}

Sie müssen die beiden globalen Variablen "mSearchView" und "isClosed" zur Aktivität hinzufügen.


Die Antwort von Jon Willis funktioniert großartig. Dies ist eine Verbesserung seiner Antwort.

Erstellen Sie zuerst eine neue Klasse, die View.OnFocusChangeListener implementiert:

public class SearchViewFocusListener implements View.OnFocusChangeListener {

    private final MenuItem mMenuItem;

    public SearchViewFocusListener(MenuItem menuItem) {
        mMenuItem = menuItem;
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            mMenuItem.collapseActionView();
            if (v instanceof SearchView) {
                ((SearchView) v).setQuery("", false);
            }
        }
    }

}

Als nächstes setze den Listener auf deine SearchView :

searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem));

Aus irgendeinem Grund menuItem.collapseActionView() nicht, also habe ich stattdessen searchView.setIconified(true) verwendet.

Dies ergibt das folgende Ergebnis als Codebeispiel.

final MenuItem searchItem = (MenuItem) menu.findItem(R.id.menu_item_search);
final SearchView searchView = (SearchView) searchItem.getActionView();

searchView.setOnQueryTextFocusChangeListener(new SearchView.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            searchView.setIconified(true);
        }
    }
});

Sie müssen setIconified zweimal aufrufen.

Um die Suchansicht zu schließen und die Tastatur zu schließen.
Beim ersten Aufruf wird der Text der Suchansicht mit der zweiten Aufruf-Tastatur gelöscht und die Suchansicht wird geschlossen.


Ich werde auf @ user1258568 die Antwort für die faulen erweitern. Das hat für mich funktioniert. Beachten Sie, dass die Abfrage gelöscht wird, wenn der Fokus verloren geht.

final MenuItem searchMenuItem = optionsMenu.findItem(R.id.search);
final SearchView searchView = (SearchView) searchMenuItem.getActionView();

searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View view, boolean queryTextFocused) {
        if(!queryTextFocused) {
            searchMenuItem.collapseActionView();
            searchView.setQuery("", false);
        }
    }
});

Wenn Sie die Tastatur ausblenden möchten, wenn der Benutzer auf das Suchsymbol auf der Tastatur klickt, kann dies einfach erreicht werden

inside onquerytextsubmitted {

searchView.clearfocus()

}


In der Gmail-App, die mit ICS vorinstalliert ist, ist die Menüschaltfläche deaktiviert, wenn Sie mehrere Elemente ausgewählt haben. Das Überlaufmenü wird hier durch die Verwendung der Überlauftaste anstelle der physikalischen Menü-Taste "gezwungen" ausgelöst. Theres eine 3rd-Party-Lib namens ActionBarSherlock, mit dem Sie das Überlaufmenü "erzwingen" können. Dies funktioniert jedoch nur auf API-Stufe 14 oder niedriger (vor ICS).





android android-actionbar android-softkeyboard