Comment utiliser SearchView dans la barre d’outils Android

Le code sur lequel je travaille utilise une Toolbar et gonfle un menu .

Voici le code

 private Toolbar mToolbar; mToolbar.inflateMenu(R.menu.chat_screen_menu); setupMenu (); private void setupMenu () { mMenu = mToolbar.getMenu(); if (mMenu != null) { if (mChatPager != null && mChatPager.getCurrentItem() > 0) { mMenu.setGroupVisible(R.id.menu_group_chats, true); mMenu.setGroupVisible(R.id.menu_group_contacts, false); } else { mMenu.setGroupVisible(R.id.menu_group_chats, false); mMenu.setGroupVisible(R.id.menu_group_contacts, true); mMenu.setGroupVisible(R.id.menu_group_otr_verified,false); mMenu.setGroupVisible(R.id.menu_group_otr_unverified,false); mMenu.setGroupVisible(R.id.menu_group_otr_off,false); } } mToolbar.setOnMenuItemClickListener(new OnMenuItemClickListener () { .......... } } 

Mais maintenant, ils nécessitent un bouton Search dans la tool_bar . J’ai réussi à le mettre, j’ai suivi un guide ici Lorsque j’essaie d’écrire quelque chose à rechercher, le toast que j’avais mis à l’épreuve, l’ listener ne l’a jamais montré. ce qui indique que l’ listener ne fonctionne pas

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.chat_screen_menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_menu_search)); final Toast toast = new Toast(mApp); if (mSearchView != null ) { mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); mSearchView.setIconifiedByDefault(false); SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { public boolean onQueryTextChange(Ssortingng newText) { mSearchSsortingng = newText; //doFilterAsync(mSearchSsortingng); toast.makeText(getApplicationContext(), "Test1", Toast.LENGTH_LONG).show(); return true; } public boolean onQueryTextSubmit(Ssortingng query) { mSearchSsortingng = query; //doFilterAsync(mSearchSsortingng); toast.makeText(getApplicationContext(), "Test2", Toast.LENGTH_LONG).show(); return true; } }; mSearchView.setOnQueryTextListener(queryTextListener); } return true; } 

Vous devez utiliser la bibliothèque Appcompat pour cela. Qui est utilisé comme ci-dessous:

dashboard.xml

    

Fichier d’activité:

 public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.dashboard, menu); MenuItem searchItem = menu.findItem(R.id.action_search); SearchManager searchManager = (SearchManager) MainActivity.this.getSystemService(Context.SEARCH_SERVICE); SearchView searchView = null; if (searchItem != null) { searchView = (SearchView) searchItem.getActionView(); } if (searchView != null) { searchView.setSearchableInfo(searchManager.getSearchableInfo(MainActivity.this.getComponentName())); } return super.onCreateOptionsMenu(menu); } 

fichier manifeste:

           

fichier xml consultable:

   

Et enfin, votre code de classe SearchResultsActivity . pour afficher le résultat de votre recherche.

Si vous souhaitez configurer la fonction de recherche dans votre Fragment , ajoutez simplement ces quelques lignes:

Étape 1 – Ajoutez le champ de recherche à votre toolbar d’ toolbar :

  

Étape 2 – Ajoutez la logique à votre onCreateOptionsMenu()

 import android.support.v7.widget.SearchView; // not the default ! @Override public boolean onCreateOptionsMenu( Menu menu) { getMenuInflater().inflate( R.menu.main, menu); MenuItem myActionMenuItem = menu.findItem( R.id.action_search); searchView = (SearchView) myActionMenuItem.getActionView(); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(Ssortingng query) { // Toast like print UserFeedback.show( "SearchOnQueryTextSubmit: " + query); if( ! searchView.isIconified()) { searchView.setIconified(true); } myActionMenuItem.collapseActionView(); return false; } @Override public boolean onQueryTextChange(Ssortingng s) { // UserFeedback.show( "SearchOnQueryTextChanged: " + s); return false; } }); return true; } 

Si vous souhaitez l’append directement dans la barre d’outils.

       

Intégrer SearchView avec RecyclerView

1) Ajouter un élément SearchView dans le menu

SearchView peut être ajouté comme actionView dans le menu en utilisant

app: useActionClass = “android.support.v7.widget.SearchView”.

    

2) Implémentez SearchView.OnQueryTextListener dans votre activité

SearchView.OnQueryTextListener a deux méthodes abstraites. Ainsi, votre squelette d’activité ressemblerait maintenant à ceci après avoir implémenté l’écouteur de texte SearchView.

 YourActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{ public boolean onQueryTextSubmit(Ssortingng query) public boolean onQueryTextChange(Ssortingng newText) } 

3) Configurer le texte, l’auditeur, etc. de SerchView

 @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); MenuItem searchItem = menu.findItem(R.id.searchBar); SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setQueryHint("Search People"); searchView.setOnQueryTextListener(this); searchView.setIconified(false); return true; } 

4) Implémenter SearchView.OnQueryTextListener

C’est ainsi que vous pouvez implémenter des méthodes abstraites de l’auditeur.

 @Override public boolean onQueryTextSubmit(Ssortingng query) { // This method can be used when query is submitted eg. creatting search history using SQLite DB Toast.makeText(this, "Query Inserted", Toast.LENGTH_SHORT).show(); return true; } @Override public boolean onQueryTextChange(Ssortingng newText) { adapter.filter(newText); return true; } 

5) Écrivez une méthode de filtrage dans votre adaptateur RecyclerView.

Vous pouvez trouver votre propre logique en fonction de vos besoins. Voici l’extrait de code exemple pour afficher la liste de noms contenant le texte saisi dans SearchView .

 public void filter(Ssortingng queryText) { list.clear(); if(queryText.isEmpty()) { list.addAll(copyList); } else { for(Ssortingng name: copyList) { if(name.toLowerCase().contains(queryText.toLowerCase())) { list.add(name); } } } notifyDataSetChanged(); } 

Un code de travail complet peut être trouvé> ICI
Vous pouvez également consulter le code sur SearchView avec une firebase database SQLite dans cette application musicale.