wake-up-neo.net

Android - NullPointerException in SearchView in der Aktionsleiste

Beim Versuch, der ActionBar in meiner Aktivität ein SearchView-Widget hinzuzufügen, ist ein Problem aufgetreten. Beim Aufruf von getActionView erhalte ich einen Nullwert, um mein SearchView-Objekt abzurufen.

Ich bin dem Android Developer Guide gefolgt und habe auch eine Menge SO - Fragen sowie einige andere Links im Internet gelesen. alles vergebens. Es könnte etwas einfaches sein, aber ich konnte es nicht herausfinden - es scheint mir, dass mein Code im Wesentlichen der gleiche ist wie der von google (abgesehen von dem Ändern einiger Namen usw.), aber es funktioniert trotzdem nicht.

Jede Hilfe wäre dankbar.

Nachfolgend sind relevante Bits des Codes enthalten. Bitte lassen Sie mich wissen, wenn Ihnen etwas unklar ist, wenn Sie eine Ahnung haben, was möglicherweise falsch ist.

Aktivitätscode:

    private ListView workflowListView;
    private DrawerLayout drawerLayout;
    private ListView drawerList;
    private ActionBarDrawerToggle drawerToggle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
        setContentView(R.layout.activity_workflow_list);

        workflowListView = (ListView) findViewById(R.id.workflowListView);
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawerList = (ListView) findViewById(R.id.drawer_list);

        drawerToggle = new ActionBarDrawerToggle(
             this,                  /* Host Activity */
             drawerLayout,         /* DrawerLayout object */
             R.drawable.ic_launcher,  /* nav drawer icon to replace 'Up' caret */
             R.string.app_name,  /* "open drawer" description */
             R.string.app_name  /* "close drawer" description */
             ) {

                /** Called when a drawer has settled in a completely closed state. */
                public void onDrawerClosed(View view) {
    //                getActionBar().setTitle("Closed drawer");
                }

                /** Called when a drawer has settled in a completely open state. */
                public void onDrawerOpened(View drawerView) {
    //                getActionBar().setTitle("Open drawer");
                }
       };

       drawerLayout.setDrawerListener(drawerToggle);
       ActionBar actionBar = getActionBar();
       actionBar.setDisplayShowTitleEnabled(false);

       actionBar.setDisplayHomeAsUpEnabled(true);
       actionBar.setHomeButtonEnabled(true);
       actionBar.setIcon(Android.R.color.transparent);

       String[] testData = {"a", "b", "c", "d"};
       ArrayList<String> workflowList = new ArrayList<String>();
           for (String s : testData) {

                workflowList.add(s);
           }

       ArrayAdapter<String> workflowAdapter = new ArrayAdapter<String>(this.getApplicationContext(), R.layout.workflow_list_item, workflowList);

            workflowListView.setAdapter(workflowAdapter);
   }


   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
   // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater inflater = getMenuInflater();

        inflater.inflate(R.menu.workflow_list, menu);
        inflater.inflate(R.menu.options_menu, menu);

        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

        // The below line returned null even though it was used in Google sample code
        SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();

        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

        return super.onCreateOptionsMenu(menu);
    }

xml/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_hint"
        Android:includeInGlobalSearch="false" />

menu/options_menu.xml:

<?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/search"
          Android:title="@string/search_title"
          Android:icon="@drawable/ic_action_search"
          Android:showAsAction="always|collapseActionView"
          Android:actionViewClass="Android.support.v7.widget.SearchView" />
</menu>
46
JakeP

Versuchen Sie, die fehlerhafte Zeile durch Folgendes zu ersetzen:

mSearchMenuItem = menu.findItem(R.id.action_search);
mSearchView = (EnglishVerbSearchView) MenuItemCompat.getActionView(mSearchMenuItem);

Wobei R.id.action_search die ID Ihres Suchbegriffs im Menü ist.

EDIT

Ihr Manifest sollte so aussehen:

<activity
       Android:name="com.bronzelabs.twc.activities.WorkflowListActivity"
       Android:label="@string/app_name"
       Android:theme="@style/Theme.AppCompat.Light" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>
<activity 
        Android:name=".activities.SearchResultActivity"
        Android:theme="@style/Theme.AppCompat.Light"
        Android:launchMode="singleTop">
        <intent-filter>
            <action Android:name="Android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data Android:name="Android.app.searchable" Android:resource="@xml/searchable"
            Android:value=".activities.SearchResultActivity" />
    </activity>

So rufen Sie setSearchableInfo auf:

mSearchView.setSearchableInfo(searchManager.getSearchableInfo(
            new ComponentName(getApplicationContext(), SearchResultActivity.class)));

EDIT 2

Stellen Sie sicher, dass Ihre Menü-XML-Datei so ist (achten Sie auf diese beiden Attribute mit dem Namespace yourapp - dies ist erforderlich, wenn Sie die kompatible Bibliothek verwenden):

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
 xmlns:yourapp="http://schemas.Android.com/apk/res-auto" >
    <item Android:id="@+id/action_search"
      Android:title="@string/action_search"
      Android:icon="@drawable/action_search"
      yourapp:showAsAction="always|collapseActionView"
      yourapp:actionViewClass="Android.support.v7.widget.SearchView" />
</menu>
106
Szymon

Überprüfen Sie zunächst, ob Sie den app - Namespace für actionViewClass verwenden.

Android:actionViewClass="Android.support.v7.widget.SearchView"- dies wirft NPE

app:actionViewClass="Android.support.v7.widget.SearchView"- verwenden Sie diesen

und zweitens 

Prüfen Sie, ob Sie samesearchView in menu.xml und in Ihrer Activity verwenden.

25
Ketan Keshri

Ich hatte wahrscheinlich ein ähnliches Bild, das in meinen Release-Builds enthalten war, nicht jedoch meine Debug-Builds, wenn auf die v21-Support-Bibliothek umgestellt wurde. Es stellte sich heraus, dass dies ein Problem der Verschleierung war, und das Hinzufügen dieser Zeile zu meiner Datei proguard-rules.txt behebte das Problem:

-keep class Android.support.v7.widget.SearchView { *; }
25
waynesford

Ich hatte ein sehr ähnliches Problem, bei dem die folgende Zeile null zurückgab

SearchView searchView = (Android.support.v7.widget.SearchView)MenuItemCompat.getActionView(searchMenuItem);

Das Update befand sich in meiner styles.xml-Datei. Ich änderte das übergeordnete Element meiner AppTheme in Theme.AppCompat.Light.

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
1
Parampal Pooni

für mich ist das die richtige Antwort: Verwenden Sie in menu/options_menu.xml Folgendes:

app:actionViewClass="Android.support.v7.widget.SearchView"
0
liang

Für jeden, der noch auf der Suche ist, habe ich alles weiter oben verfolgt und konnte die Dinge nicht in Gang bringen. Ich habe meine searchView.setSearchableInfo in einen Null-Check verpackt und voila! Es lief genau so, wie es sollte.

if (searchView != null) {
    searchView.setSearchableInfo(searchManager.getSearchableInfo(
                    new ComponentName(getApplicationContext(), SearchActivity.class)));
}
0
Jacob

Ich denke, Sie besetzen FragmentActivity müssen Sie erweitern von ActionBarActivity  

0
steving21