76 votes

Auto Collapse ActionBar SearchView sur le clavier virtuel close

Je suis actuellement en utilisant une ActionBar élément de menu pour afficher un SearchView dans la barre d'action. Lorsque la recherche de l'élément de menu est développé le clavier virtuel est affiché qui est ce que je veux. Maintenant, lorsque l'utilisateur appuie sur la touche retour pour fermer le clavier, je tiens également à l'effondrement de la SearchView dans la barre d'action.

J'ai essayé la mise en oeuvre des auditeurs OnKeyListener et OnFocusChangeListener sur le MenuItem et la ActionView. J'ai également essayé d'utiliser OnBackPressed() dans l'Activité. Aucune de détecter lorsque le bouton de retour est utilisée pour fermer le clavier virtuel.

Des idées?

J'ai mis en œuvre OnActionExpandListener de savoir quand la SearchView est visible.

99voto

Jon Willis Points 3271

Je vais développer la réponse de @ user1258568 pour les paresseux. Cela a fonctionné pour moi. Notez que cela efface votre requête en cas de perte du focus.

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

37voto

user1258568 Points 551

J'ai trouvé une meilleure solution.

 searchView.setOnQueryTextFocusChangeListener(). 
 

Le OnQueryTextFocusChangeListener est appelé lorsque le clavier est affiché ou masqué. Se fait appeler en premier lorsque le clavier est affiché et la vue de recherche aura le focus. Se fait appeler à nouveau lorsque keyboard est masqué et la vue de recherche perdra la mise au point. Vous pourrez alors utiliser close search view

 menuItem.collapseActionView().
 

10voto

Codeversed Points 1418

Just Override onBackPressed comme ceci:

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

et votre onCreateOptionsMenu gonflerait le mSearchView comme ceci:

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

Avez-vous classe implémenter ce qui suit comme ceci:

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

dont vous aurez également besoin:

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

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

Vous devrez créer "mSearchView" et "isClosed" les deux variables globales de l'activité.

1voto

Parnit Points 745

C'est ce que j'ai fait pour faire disparaître le clavier. Vous pouvez essayer de voir si cela fonctionne pour vous. Je règle les searchView sur invisible puis visible à nouveau.

     //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;
        }

     });
 

1voto

GaRRaPeTa Points 927

C'est réalisable comme ça:

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

Les solutions basées sur setOnQueryTextFocusChangeListener () ne fonctionnaient pas pour moi car l'événement n'était pas lancé. SearchView n'a pas perdu de son focus lors de sa soumission, probablement parce que j'effectue la recherche dans la même activité que la vue de recherche.

Quoi qu'il en soit, je pense qu'utiliser OnQueryTextListener est plus correct, car il décrit plus précisément l'événement de soumission de texte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X