109 votes

OnCloseListener de SearchView ne fonctionne pas

Je suis en train d'ajouter le support de l' SearchView dans l'Android 3.0+ ActionBar, mais je ne peux pas obtenir l' OnCloseListener de travail.

Voici mon code:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    searchView = (SearchView) menu.findItem(R.id.search_textbox).getActionView();
    searchView.setOnQueryTextListener(new OnQueryTextListener() {
        @Override
        public boolean onQueryTextChange(String newText) {
            searchLibrary(newText);
            return false;
        }
        @Override
        public boolean onQueryTextSubmit(String query) { return false; }
    });
    searchView.setOnCloseListener(new OnCloseListener() {
        @Override
        public boolean onClose() {
            System.out.println("Testing. 1, 2, 3...");
            return false;
        }
    });
    return true;
}

La recherche fonctionne très bien et tout fonctionne sauf pour l' OnCloseListener. Rien n'est imprimé à Logcat. Voici le Logcat pour quand je suis en appuyant sur le bouton "Fermer":

02-17 13:01:52.914: I/TextType(446): TextType = 0x0
02-17 13:01:57.344: I/TextType(446): TextType = 0x0
02-17 13:02:02.944: I/TextType(446): TextType = 0x0

J'ai regardé à travers la documentation et les exemples, mais rien ne semblait changer. Je suis en cours d'exécution sur une Asus transformer Prime et un Galaxy Nexus, à la fois sur Ice Cream Sandwich. Des idées?

Mise à jour:

Oui - System.out.println() n' travail. Voici la preuve:

   @Override
 public boolean onQueryTextChange(String newText) {
    System.out.println(newText + "hello");
    searchLibrary(newText);
    return false;
 }

Les résultats de cette Logcat:

02-17 13:04:20.094: I/System.out(21152): hello
02-17 13:04:24.914: I/System.out(21152): thello
02-17 13:04:25.394: I/System.out(21152): tehello
02-17 13:04:25.784: I/System.out(21152): teshello
02-17 13:04:26.064: I/System.out(21152): testhello

157voto

niki huang Points 636

Je rencontre aussi ce problème, et je n’ai pas d’autre choix que d’abandonner "oncloselistener". Au lieu de cela, vous pouvez obtenir votre menuItem, puis setOnActionExpandListener . Ensuite, remplacez les méthodes non-imaginaires.

 @Override
public boolean onMenuItemActionExpand(MenuItem item) {
    // TODO Auto-generated method stub
    Log.d("*******","onMenuItemActionExpand");
    return true;
}

@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
    //do what you want to when close the sesarchview
    //remember to return true;
    Log.d("*******","onMenuItemActionCollapse");
    return true;
}
 

62voto

lomza Points 1763

Pour l'API Android 14+ (ICS et plus) utilisez ce code:

// When using the support library, the setOnActionExpandListener() method is
// static and accepts the MenuItem object as an argument
MenuItemCompat.setOnActionExpandListener(menuItem, new OnActionExpandListener() {
    @Override
    public boolean onMenuItemActionCollapse(MenuItem item) {
        // Do something when collapsed
        return true;  // Return true to collapse action view
    }

    @Override
    public boolean onMenuItemActionExpand(MenuItem item) {
        // Do something when expanded
        return true;  // Return true to expand action view
    }
});

Pour plus d'informations: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView

Ref: onActionCollapse/onActionExpand

31voto

Ben Benson Points 171

Pour ce problème, je suis arrivé avec quelque chose comme ça,

 private SearchView mSearchView;

@TargetApi(14)
@Override
public boolean onCreateOptionsMenu(Menu menu)
{

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.conversation_index_activity_menu, menu);

    mSearchView = (SearchView) menu.findItem(R.id.itemSearch).getActionView();

    MenuItem menuItem = menu.findItem(R.id.itemSearch);

    int currentapiVersion = android.os.Build.VERSION.SDK_INT;
    if (currentapiVersion >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    {
        menuItem.setOnActionExpandListener(new OnActionExpandListener()
        {

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item)
            {
                // Do something when collapsed
                Log.i(TAG, "onMenuItemActionCollapse " + item.getItemId());
                return true; // Return true to collapse action view
            }

            @Override
            public boolean onMenuItemActionExpand(MenuItem item)
            {
                // TODO Auto-generated method stub
                Log.i(TAG, "onMenuItemActionExpand " + item.getItemId());
                return true;
            }
        });
    } else
    {
        // do something for phones running an SDK before froyo
        mSearchView.setOnCloseListener(new OnCloseListener()
        {

            @Override
            public boolean onClose()
            {
                Log.i(TAG, "mSearchView on close ");
                // TODO Auto-generated method stub
                return false;
            }
        });
    }


    return super.onCreateOptionsMenu(menu);

}
 

20voto

Dario Points 185

J'ai rencontré le même problème sur android 4.1.1. Ressemble, c'est un bug connu: https://code.google.com/p/android/issues/detail?id=25758

De toute façon, comme une solution de contournement que j'ai utilisé changement d'état d'écoute (quand SearchView est détachée de la barre d'action, il est également fermé bien évidemment).

view.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {

    @Override
    public void onViewDetachedFromWindow(View arg0) {
        // search was detached/closed
    }

    @Override
    public void onViewAttachedToWindow(View arg0) {
        // search was opened
    }
});

Ci-dessus le code a bien fonctionné dans mon cas.


Je poste une réponse ici: http://stackoverflow.com/a/24573266/2162924

12voto

Michell Bak Points 6312

J'ai fini par utiliser un peu de bidouille, cela fonctionne bien pour mon but - je ne suis pas sûr que cela fonctionne à toutes fins. Quoi qu'il en soit, je vérifie si la requête de recherche est vide. Ce n'est pas vraiment lié au SearchView de OnCloseListener - qui ne fonctionne toujours pas!

 searchView.setOnQueryTextListener(new OnQueryTextListener() {
            @Override
            public boolean onQueryTextChange(String newText) {
                if (newText.length() > 0) {
                    // Search
                } else {
                    // Do something when there's no input
                }
                return false;
            }
            @Override
            public boolean onQueryTextSubmit(String query) { return false; }
        });
 

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