web-dev-qa-db-fra.com

Comment utiliser SearchView dans la barre d'outils Android

Le code sur lequel je travaille utilise une Toolbar et gonfle une 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 ont besoin d’un bouton Search dans le tool_bar. Je l’ai réussi à le mettre, j’ai suivi un guide icilistener jamais montré. qui indique que 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(String newText)
            {
                mSearchString = newText;
                //doFilterAsync(mSearchString);
                toast.makeText(getApplicationContext(), "Test1", Toast.LENGTH_LONG).show();
                return true;
            }

            public boolean onQueryTextSubmit(String query)
            {
                mSearchString = query;
                //doFilterAsync(mSearchString);
                toast.makeText(getApplicationContext(), "Test2", Toast.LENGTH_LONG).show();

                return true;
            }
        };

        mSearchView.setOnQueryTextListener(queryTextListener);
    }

    return true;

}
104
Shudy

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

dashboard.xml

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

    <item
        Android:id="@+id/action_search"
        Android:icon="@Android:drawable/ic_menu_search"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="Android.support.v7.widget.SearchView"
        Android:title="Search"/>
</menu>

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:

<meta-data 
      Android:name="Android.app.default_searchable" 
      Android:value="com.apkgetter.SearchResultsActivity" /> 

        <activity
            Android:name="com.apkgetter.SearchResultsActivity"
            Android:label="@string/app_name"
            Android:launchMode="singleTop" >
            <intent-filter>
                <action Android:name="Android.intent.action.SEARCH" />
            </intent-filter>
            <intent-filter>
                <action Android:name="Android.intent.action.VIEW" />
            </intent-filter>

            <meta-data
                Android:name="Android.app.searchable"
                Android:resource="@xml/searchable" />
        </activity>

fichier xml interrogeable:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:hint="@string/search_hint"
    Android:label="@string/app_name" />

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

185
Riser

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

Étape 1 - Ajouter le champ de recherche à vous toolbar

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

É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(String query) {
            // Toast like print
            UserFeedback.show( "SearchOnQueryTextSubmit: " + query);
            if( ! searchView.isIconified()) {
                searchView.setIconified(true);
            }
            myActionMenuItem.collapseActionView();
            return false;
        }
        @Override
        public boolean onQueryTextChange(String s) {
            // UserFeedback.show( "SearchOnQueryTextChanged: " + s);
            return false;
        }
    });
    return true;
}
149
tjm1706

Si vous souhaitez l'ajouter directement dans la barre d'outils.

<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.AppBarLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

    <Android.support.v7.widget.Toolbar
        Android:id="@+id/app_bar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <SearchView
            Android:id="@+id/searchView"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:iconifiedByDefault="false"
            Android:queryHint="Search"
            Android:layout_centerHorizontal="true" />

    </Android.support.v7.widget.Toolbar>

</Android.support.design.widget.AppBarLayout>

24
Ali

Intégration de 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" . 

<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="rohksin.com.searchviewdemo.MainActivity">
<item
    Android:id="@+id/searchBar"
    app:showAsAction="always"
    app:actionViewClass="Android.support.v7.widget.SearchView"
    />
</menu>

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(String query)

   public boolean onQueryTextChange(String newText) 

}

3) Configurer le texte Hint SerchView, auditeur, etc.

@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

Voici comment vous pouvez implémenter des méthodes abstraites du listener.

@Override
public boolean onQueryTextSubmit(String query) {

    // This method can be used when a query is submitted eg. creating search history using SQLite DB

    Toast.makeText(this, "Query Inserted", Toast.LENGTH_SHORT).show();
    return true;
}

@Override
public boolean onQueryTextChange(String newText) {

    adapter.filter(newText);
    return true;
}

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

Vous pouvez définir votre propre logique en fonction de vos besoins. Voici l'extrait de code qui présente la liste de Nom contenant le texte saisi dans la variable SearchView

public void filter(String queryText)
{
    list.clear();

    if(queryText.isEmpty())
    {
        list.addAll(copyList);
    }
    else
    {

        for(String name: copyList)
        {
            if(name.toLowerCase().contains(queryText.toLowerCase()))
            {
                list.add(name);
            }
        }

    }

    notifyDataSetChanged();
}

Vous trouverez un échantillon complet du code de travail> ICI
Vous pouvez également extraire le code sur SearchView avec une base de données SQLite dans cette Music App

11
Rohit Singh

Implémentation de SearchView sans l'utilisation du fichier menu.xml et ouverture par le bouton

Dans votre Activity nous devons utiliser la méthode de la onCreateOptionsMenumethod dans laquelle nous allons gonfler par programme la Serchview

private MenuItem searchMenu;
private String mSearchString="";

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        SearchManager searchManager = (SearchManager) StoreActivity.this.getSystemService(Context.SEARCH_SERVICE);


        SearchView mSearchView = new SearchView(getSupportActionBar().getThemedContext());
        mSearchView.setQueryHint(getString(R.string.Prompt_search)); /// YOUR HINT MESSAGE
        mSearchView.setMaxWidth(Integer.MAX_VALUE);

        searchMenu = menu.add("searchMenu").setVisible(false).setActionView(mSearchView);
        searchMenu.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);


        assert searchManager != null;
        mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        mSearchView.setIconifiedByDefault(false);

        SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
            public boolean onQueryTextChange(String newText) {
                mSearchString = newText;

                return true;
            }

            public boolean onQueryTextSubmit(String query) {
                mSearchString = query;

                searchMenu.collapseActionView();


                return true;
            }
        };

        mSearchView.setOnQueryTextListener(queryTextListener);


        return true;
    }

Et dans votre classe d’activité, vous pouvez ouvrir la SearchView sur n’importe quel bouton, cliquez sur la barre d’outils comme ci-dessous

YOUR_BUTTON.setOnClickListener(view -> {

            searchMenu.expandActionView();

        });
0
Ravindra Kushwaha