Essayer d'inclure une searchview dans la barre d'actions. Pour cela, j'ai fait ce qui suit:
Créé MenuSearch.xml dans le dossier de menu comme indiqué ci-dessous:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item
Android:id="@+id/action_search"
Android:actionViewClass="Android.Support.V7.Widget.SearchView"
Android:icon="@Android:drawable/ic_menu_search"
Android:showAsAction="always"
Android:title="Search"/>
</menu>
Inclus la méthode OnCreateOptionsMenu dans le fragment:
public override void OnCreateOptionsMenu(IMenu menu, MenuInflater inflater)
{
inflater.Inflate(Resource.Menu.MenuSearch, menu);
base.OnCreateOptionsMenu(menu, inflater);
var searchManager = (SearchManager) this.Activity.GetSystemService(Context.SearchService);
searchView = (SearchView) (menu.FindItem(Resource.Id.action_search).ActionView);
searchView.SetSearchableInfo(searchManager.GetSearchableInfo(Activity.ComponentName));
}
Et j'ai mis HasOptionsMenu = true;
dans une création du fragment.
Avec le code ci-dessus, j'obtiens un pointeur null dans la ligne searchView.SetSearchableInfo...
. Je ne sais pas pourquoi cela se produit, même si tout semble être correct et en place.
Sur la base de quelques suggestions pour résoudre un problème similaire, j'ai également testé l'option ci-dessous pour searchview.
var item = menu.FindItem (Resource.Id.action_search);
var searchItem = MenuItemCompat.GetActionView(item);
searchView = searchItem.JavaCast<Android.Support.V7.Widget.SearchView>();
searchView.SetSearchableInfo(searchManager.GetSearchableInfo(Activity.ComponentName));
Mais encore une fois, searchView a la valeur null.
Maintenant que j'ai essayé les options possibles, je ne comprends pas pourquoi searchview devient nul.
Toute aide est très appréciée.
Changez votre MenuSearch.xml en
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item Android:id="@+id/action_search"
Android:title="@string/app_name"
Android:icon="@drawable/ic_action_search"
app:showAsAction="collapseActionView|ifRoom"
/>
</menu>
Et dans votre fragment pour ajouter searchView.setOnQueryTextListener
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.search_option_menu, menu);
MenuItem item = menu.findItem(R.id.action_search);
SearchView searchView = new SearchView(((MainActivity) mContext).getSupportActionBar().getThemedContext());
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
MenuItemCompat.setActionView(item, searchView);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
searchView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}
);
}
Réponse mise à jour pour 2018. Désolé pour Kotlin, si vous utilisez Java.
Votre ressource de menu xml (search_menu.xml par exemple):
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item Android:id="@+id/action_search"
Android:title="@string/app_name"
Android:icon="@drawable/ic_search"
app:showAsAction="collapseActionView|ifRoom"
/>
</menu>
Code de montage:
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater?) {
super.onCreateOptionsMenu(menu, inflater)
menu.clear()
inflater?.inflate(R.menu.search_menu, menu)
val searchView = SearchView((context as MainActivity).supportActionBar?.themedContext ?: context)
menu.findItem(R.id.action_search).apply {
setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW or MenuItem.SHOW_AS_ACTION_IF_ROOM)
actionView = searchView
}
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String): Boolean {
return false
}
override fun onQueryTextChange(newText: String): Boolean {
return false
}
})
searchView.setOnClickListener {view -> }
}
Vous aurez probablement aussi besoin de mettre cette ligne dans onCreate()
(travaillé pour mon fragment) pour que tout cela apparaisse:
setHasOptionsMenu(true)
j'ai résolu ce problème je veux partager ma réponse pour searchView NullPointerException
nous devons supprimer la méthode ci-dessous de l'activité principale
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
return true;
et utiliser fragment intérieur dans les méthodes OnActivityCreated setHasOptionsMenu(true)
et Override
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// handle item selection
switch (item.getItemId()) {
case R.id.action_search:
// onCall(); //your logic
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Votre search_options_menu.xml devrait ressembler à ceci:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item Android:id="@+id/action_search"
Android:title="@string/app_name"
Android:icon="@drawable/ic_action_search"
app:showAsAction="collapseActionView|ifRoom"
/>
</menu>
Remplacez onCreateOptionMenu méthode dans votre fragment setHasOptionsMenu(true);
dans onCreate () sur votre fragment.
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.search_option_menu, menu);
MenuItem item = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
MenuItemCompat.setActionView(item, searchView);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
//Do search code here
return true;
}
});
}