web-dev-qa-db-fra.com

SearchView getActionView qui renvoie null

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);
}
44
Axxiss

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:

  • Chaque activité qui utilise la variable ActionBarCompat doit étendre ActionBarActivity au lieu de FragmentActivity directement
  • Chaque activité qui utilise ActionBarCompat 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.

17
Boris Strandjev

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.

110
maxandron

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 { *; }
30
tomrozb

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 ...

7
Alef Carlos

 Change in the import Changer pour importer Android.support.v7.widget.SearchView m'a aidé

1
Progga Ilma

J'ai ajouté ça aussi:

setHasOptionsMenu(true);

Travailler avec ceci et @maxandron answer

0
n1rocket

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.

0
Daniel Wilson

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?

0
Franzé Jr.