web-dev-qa-db-fra.com

détection d'un clic sur le bouton retour de la barre d'action - (OnOptionsItemSelected n'appelant pas lorsque vous cliquez sur le bouton retour de la barre d'action)

J'ai une barre d'action contenant une searchview. Lorsque l'utilisateur clique sur le bouton de recherche et réduit la vue de recherche, la barre d'actions affiche un bouton de retour sur le côté gauche. 

enter image description here

Comment pouvons-nous détecter quand l'utilisateur clique sur ce bouton de retour?

Modifier

sur la base de la réponse, j’ai vérifié ma OnOptionsItemSelected mais elle n’appelle pas trop. Voici le code de ma OnOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    if (item != null && id == Android.R.id.home) {
        if (mNavigationDrawerFragment.isDrawerOpen(Gravity.RIGHT)) {
            mNavigationDrawerFragment.closeDrawer(Gravity.RIGHT);
        } else {
            mNavigationDrawerFragment.openDrawer(Gravity.RIGHT);

        }
        return true;
    }
    if (id == R.id.action_search) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
13

Mettez ceci sur la méthode onCreateOptionsMenu:

MenuItemCompat.setOnActionExpandListener(menu.findItem(R.id.action_search), new MenuItemCompat.OnActionExpandListener() {
    @Override
    public boolean onMenuItemActionExpand(MenuItem item) {

        return true;
    }

    @Override
    public boolean onMenuItemActionCollapse(MenuItem item) {

        //DO SOMETHING WHEN THE SEARCHVIEW IS CLOSING

        return true;
    }
});
12
Lisandro Lopez

Vous devez ajouter les métadonnées de votre fichier manifest.xml pour quelle activité vous le souhaitez.

Comme 

<activity
        Android:name=".Example"
        Android:label="@string/Example"
        Android:theme="Theme.AppCompat.Light">
        <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value=".MainActivity" />
    </activity>

et votre code devrait être comme ça dans l'exemple

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 .......
         getActionBar().setDisplayHomeAsUpEnabled(true);

......
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case Android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
    }
    return super.onOptionsItemSelected(item);
}
4
massaimara98

Suffit de remplacer la méthode ci-dessous. 

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
            case Android.R.id.home:
             //do whatever you want to do here.

            }
            return true;
    }
2
Avtar Guleria

Essayez ceci: plutôt que d’utiliser onOptionsItemSelected pour détecter le changement de recherche, utilisez OnQueryTextListener. OnQueryTextChanged sera ensuite appelé avec le bouton Précédent (et à tout autre moment où le texte de la requête sera modifié).

Lorsque vous configurez votre menu, attribuez à searchView le listener. Le onQueryTextChange sera appelé chaque fois que les critères de recherche changent (sur n'importe quel clavier, à l'exception du bouton de recherche), et il sera appelé avec une chaîne vide lorsque le bouton de retour sera enfoncé. Le onQueryTextSubmit sera appelé lorsque le bouton de recherche sera appuyé sur le clavier.

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.main, menu);

    final SearchView searchView = (SearchView)menu.findItem(R.id.action_search).getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            Log.i(TAG,"onQueryTextSubmit: " + s);
            searchView.clearFocus();
            return true;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            Log.i(TAG,"onQueryTextChange: " + s);
            FragmentManager fragmentManager = getSupportFragmentManager();
            Fragment fragment = fragmentManager.findFragmentByTag(currentFragmentTag);
            if (fragment.getClass().getName().startsWith("com.mydomain.myapp.mainactivity.MyFragment")) {
                if (s.isEmpty()) {
                    ((SingleICPListFragment)fragment).clearSearchCriteria();
                } else {
                    ((SingleICPListFragment) fragment).applySearchCriteria(s);
                }
            }
            return true;
        }
    });

    SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

    return true;
}
0
Eric Rowe