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;
}
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.
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;
}
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>
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>
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)
}
@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;
}
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;
}
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
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 onCreateOptionsMenu
method 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();
});