Question

Je suis en train d'ajouter le support pour le SearchView dans l'Android 3.0+ ActionBar, mais je ne peux pas obtenir le OnCloseListener au 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 travaille tous à l'exception du OnCloseListener. Rien n'est imprimé à Logcat. Voici le Logcat 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

Je l'ai regardé à travers la documentation et des échantillons, mais rien ne semblait changer il. Je l'exécuter sur un Asus Transformer Prime et un Galaxy Nexus, à la fois sur Ice Cream Sandwich. Toutes les idées?

Mise à jour:

Oui - System.out.println() Finalité travail. Voici la preuve de:

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

Les résultats dans ce 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
Était-ce utile?

La solution

Je rencontre également ce problème, et je n'ai pas d'autre choix, mais renoncer à « oncloselistener ». Au lieu de cela, vous pouvez obtenir votre ligneMenu, setOnActionExpandListener alors. Ensuite, remplacer les méthodes de unimplents.

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

Autres conseils

Pour Android API 14+ (ICS) et plus utiliser 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 / sujets / ui / actionbar.html # ActionView

Ref: onActionCollapse / onActionExpand

Pour ce problème, je suis venu 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);

}

je suis tombé même problème sur 4.1.1 Android. On dirait qu'il est un bug connu: https://code.google. com / p / android / questions / détail? id = 25758

Quoi qu'il en soit, comme une solution de contournement i utilisé écouteur de changement d'état (lorsque SearchView est détaché de la barre d'actions, il est évidemment aussi fermé).

view.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {

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

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

code ci-dessus a bien fonctionné dans mon cas.


Je posterai ici même réponse: https://stackoverflow.com/a/24573266/2162924

J'ai fini avec un peu d'un hack, qui fonctionne bien pour mon but - pas sûr que ça va marcher avec toutes fins utiles. Quoi qu'il en soit, je fais un contrôle pour voir si la requête de recherche est vide. Ce n'est pas vraiment lié à la SearchView du OnCloseListener bien - cela 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; }
        });

Eh bien, ce a résolu mon problème:

Point de menu avec showAsAction="always"

<item
    android:id="@+id/action_search"
    android:icon="@drawable/ic_action_search"
    android:title="Search"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always"/>

et de l'activité

searchView.setOnCloseListener(new OnCloseListener() {

        @Override
        public boolean onClose() {

            Log.i("SearchView:", "onClose");
            searchView.onActionViewCollapsed();
            return false;
        }
    });

Je l'ai rencontré le même problème avec onCloseListener pas invoquer le SearchView. Comprendre le problème de bug soulevé dans 25758 , et quelques affectations I ont lu, d'invoquer onCloseListener, vous devez définir:

searchView.setIconifiedByDefault(true);

Mais pour mon cas, je voulais avoir le point de vue de la recherche ouverte et pas iconifiée tout le temps. Je parviens à résoudre ce problème en ajoutant une ligne ci-dessous:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.search_bar, menu);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchView = (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setOnQueryTextListener(queryTextListener);
    searchView.setIconifiedByDefault(true);
    searchView.setIconified(false);
    return true;
}

Le searchView.setIconified (false) entraînera la SearchView d'ouvrir, malgré le réglage par défaut de iconifiée à true dans la ligne précédente. De cette façon, je réussi à avoir à la fois un SearchView qui ouvre tout le temps et l'avoir Invoke la onCloseListener.

Afin de rendre le travail de OnCloseListener, assurez-vous que showAsAction est réglé sur always dans l'élément de menu de recherche.

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      tools:context=".SearchActivity">

    <item
        android:id="@+id/search"
        android:title="@string/search"
        android:icon="@drawable/ic_search_toolbar"
        app:showAsAction="always"
        app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>

Pour le problème de MenuItemCompat j'ai ajouté ViewTreeObserver pour suivre l'état de visibilité. Vous pouvez vérifier ma réponse ici: https://stackoverflow.com/a/28762632/1633609

Créer l'élément de menu avec l'ensemble app:showAsAction à toujours.

<item   
 android:id="@+id/action_search"  
 android:title="..."  
 android:icon="..."  
 app:actionViewClass="android.support.v7.widget.SearchView"  
 app:showAsAction="always"/>

Lors de la création du SearchView dans la méthode onCreateOptionsMenu faire quelque chose de similaire

inflater.inflate(R.menu.menu_search, menu);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView search = (SearchView) item.getActionView();
search.setQueryHint(getString(R.string.search_brand_item));
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
  @Override
  public boolean onQueryTextSubmit(String query) {
    // add your code
    return false;
  }

  @Override
  public boolean onQueryTextChange(String newText) {
    // add your code 
    return false;
  }
});
search.setOnCloseListener(new SearchView.OnCloseListener() {
  @Override
  public boolean onClose() {
    // add your code here
    return false;
  }
});
search.setIconifiedByDefault(true); // make sure to set this to true

Les besoins de search.setIconifiedByDefault(true) à régler à true pour appeler la méthode onClose() sur le SearchView.OnCloseListener() créé ci-dessus.

La raison pour laquelle la OnCloseListener n'est pas appelé est parce qu'il ya un bug dans le code Android -. L'auditeur est appelée que si vous appelez aussi setIconifiedByDefault(true)

semble un vieux fil déjà, mais je pensais que je suis la même API problème 18 dans le premier début. Après googlé autour, trouvé ce fil, une heure lire le javadoc essayé et errored pour quelque chose que je ne comprends pas tout à faire semblant javadoc, les travaux suivants pour moi maintenant:

searchView.setIconifiedByDefault(true);

   // OnQueryTextListener
   @Override
   public boolean onQueryTextSubmit(String query) {
      Log.d(tag, "onQueryTextSubmit: " + query);
      return true;
   }

   @Override
   public boolean onQueryTextChange(String query) {
      Log.d(tag, "onQueryTextChange: " + query);
      return true;
   }

   // OnCloseListener
   @Override
   public boolean onClose() {
      Log.w(tag, "onClose: ");
      return false;
   }

Je joue avec peu de vrai / faux, qui fait en quelque sorte la différence, et cela fonctionne pour moi. Si tout va bien, il pourrait gagner du temps de quelqu'un.

Il est une solution de contournement, mais a travaillé pour moi

  searchView.setOnQueryTextListener(new android.widget.SearchView.OnQueryTextListener() {

                String lastText;

                @Override
                public boolean onQueryTextChange(final String newText) {
                    if (lastText != null && lastText.length() > 1 && newText.isEmpty()) {
                        // close ctn clicked

                        return true;
                    }
}
    searchView.setOnCloseListener {
        d("click", "close clicked")
        return@setOnCloseListener false
    }

si vous cliquez sur SearchView close ->

D / cliquez sur: fermer cliquée

Je rencontré ce problème en essayant de détecter la projection / révocation du SearchView. Je fini par utiliser un auditeur différent et cela a fonctionné pour ce que je dois:

        setOnQueryTextFocusChangeListener { _, hasFocus ->
            if (hasFocus) {
                // SearchView is being shown
            } else {
                // SearchView was dismissed
            }
        }

Il n'y a pas de console dans Android pour vous connecter à. Au lieu de cela, utilisez le cadre de l'exploitation forestière Android:

Log.d("Test Tag", "Testing.  1, 2, 3...");

Voir aussi cette question: Pourquoi pas « System.out .println » travailler dans Android?

Il existe deux modèles communs pour SearchView.setOnCloseListener(). Ceci est vraiment vrai de tous les auditeurs, mais je me adresse à votre question. La première est de créer une fonction d'écouteur et l'attacher à une variable membre, et le second est de rendre la classe implémente l'interface et que le gestionnaire soit une fonction membre.

Création d'un objet écouteur ressemble à ceci:

private SearchView mSearchView;
private final SearchView.OnCloseListener mOnCloseListener = 
    new SearchView.OnCloseListener() {
        public boolean onClose() {
            doStuff();
            return myBooleanResult;
        }
    };
mSearchView.setOnCloseListener(mOnCloseListener);

auditeur mise en œuvre au regard du niveau de la classe comme ceci:

public class MyClass implements OnCloseListener {
    private SearchView mSearchView;

    public MyClass(...) {
        mSearchView.setOnCloseListener(this);
    }

    @Override
    public boolean onClose() {
        doStuff();
        return false;
    }
}

Je n'ai pas vu des exemples qui créent ad-hoc OnCloseListener, comme vous l'avez fait dans votre question.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top