Cela fonctionnait il y a quelques jours, mais tout à coup, ça s'est arrêté. Je souhaite uniquement utiliser le widget de recherche de la barre d'action lorsqu'un certain fragment est visible.
Maintenant, je ne parviens pas à obtenir la variable SearchView
. getActionView
renvoie toujours la valeur null.
searchable.xml
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:label="@string/app_name"
Android:hint="@string/search_for_places">
</searchable>
Manifest.xml
<activity
Android:name=".ui.activities.MainActivity"
Android:launchMode="singleTop">
<intent-filter>
<action Android:name="Android.intent.action.MAIN"/>
<category Android:name="Android.intent.category.LAUNCHER"/>
<action Android:name="Android.intent.action.SEARCH"/>
</intent-filter>
<meta-data
Android:name="Android.app.searchable"
Android:resource="@xml/searchable"/>
<meta-data
Android:name="Android.app.default_searchable"
Android:value=".ui.activities.MainActivity" />
</activity>
menu.xml
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:myapp="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/action_search_place"
Android:icon="@drawable/ic_2_action_search"
Android:orderInCategory="1"
Android:title="@string/title_search"
myapp:showAsAction="collapseActionView|ifRoom"
myapp:actionViewClass="Android.support.v7.widget.SearchView"/>
</menu>
Le fragment
...
setHasOptionsMenu(true);
...
@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
inflater.inflate(R.menu.menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search_place);
mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
SearchManager searchManager = (SearchManager) getBaseActivity().getSystemService(Context.SEARCH_SERVICE);
if (mSearchView != null) {
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
mSearchView.setIconifiedByDefault(true);
mSearchView.setOnQueryTextListener(this);
}
super.onCreateOptionsMenu(menu, inflater);
}
Aujourd'hui, j'ai eu le même problème et je pense l'avoir résolu. Il s’est avéré que j’ai fait quelques choses qui ne correspondaient pas exactement au contrat ActionBarCompat
:
ActionBarCompat
doit étendre ActionBarActivity
au lieu de FragmentActivity
directementActionBarCompat
doit déclarer son thème héritant des thèmes ActionBarCompat
.Les deux personnes que j'ai trouvées regardaient la vidéo explication de Google.
Maintenant, ma searchView
n'est plus null
.
J'ai eu le même problème parce que dans mon menu, j'ai utilisé: Android:actionViewClass="Android.widget.SearchView"
as comme indiqué dans la documentation de Google.
Eh bien, il s'avère que si j'utilise AppCompatActivity, je devrais plutôt utiliser app:actionViewClass="Android.widget.SearchView"
J'espère que ça aide quelqu'un.
Si vous utilisez proguard, voici la réponse possible: https://code.google.com/p/Android/issues/detail?id=58508
En bref, ajoutez la ligne ci-dessous à votre fichier de configuration proguard proguard-rules.pro
.
-keep class Android.support.v7.widget.SearchView { *; }
Je l'ai corrigé: dans le menu xml, j'ai utilisé un espace de noms d'applications:
app:showAsAction="collapseActionView|always"
app:actionViewClass="Android.support.v7.widget.SearchView"
Le tutoriel d'Android, https://developer.Android.com/training/search/setup.html , utilise Android: showAs et Android: actionView ...
J'ai ajouté ça aussi:
setHasOptionsMenu(true);
Travailler avec ceci et @maxandron answer
Pour moi, la solution suivante a fonctionné:
<?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"
xmlns:tools="http://schemas.Android.com/tools"
tools:context="com.dev.ttburger.conttagem.BuscarProdutoActivity">
<item
Android:id="@+id/search"
Android:icon="@drawable/ic_search"
Android:title="Buscar"
app:showAsAction="always"
app:actionViewClass="Android.support.v7.widget.SearchView"/>
</menu>
Changer 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"
xmlns:tools="http://schemas.Android.com/tools"
tools:context="com.dev.ttburger.conttagem.BuscarProdutoActivity">
<item
Android:id="@+id/search"
Android:icon="@drawable/ic_search"
Android:title="Buscar"
app:showAsAction="always"
app:actionViewClass="Android.SearchView"/>
</menu>
Aujourd'hui, j'ai compris que l'appel de getActionView () devenait nul sur les éléments qui n'avaient pas:
Android:showAsAction="always"
Il semble que sinon, ils ne gonflent pas correctement.
J'étais avec la même erreur. Et j'ai fait les choses suivantes:
J'ai une activité s'étendant par FragmentActivity:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.feed, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search)
.getActionView();
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));
return true;
}
Searchable.xml:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:label="@string/app_label"
Android:hint="@string/search_hint" >
</searchable>
Menu.xml:
<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="br.com.srtorcedor.FeedActivity">
<item Android:id="@+id/action_search"
Android:icon="@drawable/abc_ic_search"
Android:title="@string/search_title"
Android:showAsAction="always"
Android:actionViewClass="Android.widget.SearchView"/>
</menu>
AndroidManifest:
<activity
Android:name=".FeedActivity"
Android:icon="@drawable/ic_action_pins"
Android:label="@string/title_activity_feed">
<intent-filter>
<action Android:name="Android.intent.action.SEARCH" />
</intent-filter>
<meta-data
Android:name="Android.app.searchable"
Android:resource="@xml/searchable" />
</activity>
Pourriez-vous vérifier si cela fonctionne avec vous?