wake-up-neo.com

Auto Collapse ActionBar SearchView auf der Soft-Tastatur schließen

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

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

Irgendwelche Ideen?

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

76
user1258568

Ich werde auf die Antwort von @ user1258568 für die Faulen eingehen. Das hat bei mir funktioniert. Beachten Sie, dass Ihre 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);
        }
    }
});
99
Jon Willis

Ich habe eine bessere Lösung gefunden.

searchView.setOnQueryTextFocusChangeListener(). 

Das 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 keyboard ausgeblendet ist und die Suchansicht den Fokus verliert. Kann close search viewdann mit

menuItem.collapseActionView().
37
user1258568

Überschreibe einfach onBackPressed wie folgt:

@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 folgendermaßen 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 Folgendes implementiert:

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" für die Aktivität festlegen.

10
Codeversed

Sie müssen nur das Attribut "collapseActionView" in das Menülayout einfügen

<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>

Dadurch erhalten Sie die Funktionalität, nach der Sie selbst suchen. Vergessen Sie nicht, die Methode "clearFocus" im SearchView aufzurufen, um die Tastatur zu schließen, sobald Sie die Abfrage gesendet haben.

2
Rodrigo de Blas

Die Antwort von Jon Willis funktioniert hervorragend. Dies ist eine Verbesserung seiner Antwort.

Erstellen Sie zunächst 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 setzen Sie den Listener auf Ihr SearchView:

searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem));
2
Jared Rummler

Das ist so erreichbar:

   private void setupSearchView(Menu menu) {
        final MenuItem searchMenuItem = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) searchMenuItem.getActionView();

        [...]

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                searchMenuItem.collapseActionView();
                return false;
            }
            @Override
            public boolean onQueryTextChange(String newText) {
                return true;
            }
        });
    }

Lösungen, die auf setOnQueryTextFocusChangeListener () basieren, haben bei mir nicht funktioniert, da das Ereignis nicht gestartet wurde. Die searchView verlor bei der Übermittlung nicht den Fokus, wahrscheinlich, weil ich die Suche in derselben Aktivität durchführe, die die Suchansicht enthält.

Ich denke jedenfalls, dass die Verwendung von OnQueryTextListener korrekter ist, da es das Ereignis der Übermittlung von Text genauer beschreibt.

1
GaRRaPeTa

Das habe ich getan, um die Tastatur verschwinden zu lassen. Sie können versuchen zu sehen, ob dies für Sie funktioniert. Ich setze das 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;
        }

     });
1
Parnit

Wenn Sie die Tastatur reduzieren möchten, wenn der Benutzer auf das Suchsymbol auf der Tastatur klickt, können Sie dies auf einfache Weise erreichen

inside onquerytextsubmitted {

searchView.clearfocus()

}

0
geniushkg
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.home_screen, menu);

        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        final MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
        final SearchView searchView = (SearchView) searchMenuItem
                .getActionView();
        searchView.setIconifiedByDefault(false);
        if (searchManager != null && searchView != null) {
            searchView.setSearchableInfo(searchManager
                    .getSearchableInfo(getComponentName()));

            searchView
                    .setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {

                        @Override
                        public void onFocusChange(View v, boolean hasFocus) {

                            if (!hasFocus) {
                                if (searchMenuItem != null) {
                                    searchMenuItem.collapseActionView();
                                }// end if
                                if (searchView != null) {
                                    searchView.setQuery("", false);

                                }// end if
                            }// end if

                        }
                    });

            searchView
                    .setOnQueryTextListener(new SearchView.OnQueryTextListener() {

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

                            }
                            return false;
                        }

                        @Override
                        public boolean onQueryTextChange(String newText) {
                            // TODO Auto-generated method stub
                            return false;
                        }
                    });

        }

        return super.onCreateOptionsMenu(menu);
    }
0
confucius

Aus irgendeinem Grund hat menuItem.collapseActionView() nicht funktioniert, daher 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);
        }
    }
});
0
bastien

Sie müssen setIconified zweimal aufrufen.

So reduzieren Sie die Suchansicht und schließen die Tastatur.
Beim ersten Anruf wird der Text der Suchansicht mit der Zweitanruftastatur gelöscht und die Suchansicht geschlossen.

0
nosaiba darwish