it-swarm.com.de

Searchview funktioniert nicht, seit App kompatibel ist

Seit ich App kompatibel implementiert habe, funktioniert mein Searchview nicht mehr:

 Process: com.laurenswuyts.witpa, PID: 26666
    Java.lang.NullPointerException: Attempt to invoke virtual method 'void Android.support.v7.widget.SearchView.setSearchableInfo(Android.app.SearchableInfo)' on a null object reference
            at com.laurenswuyts.witpa.Activities.Events.EventActivity.onCreateOptionsMenu(EventActivity.Java:75)
            at Android.app.Activity.onCreatePanelMenu(Activity.Java:2820)
            at Android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.Java:275)
            at Android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.Java:276)
            at Android.support.v7.app.ActionBarActivityDelegate$1.onCreatePanelMenu(ActionBarActivityDelegate.Java:79)
            at Android.support.v7.widget.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.Java:49)
            at Android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.Java:459)
            at Android.support.v7.internal.app.ToolbarActionBar$1.run(ToolbarActionBar.Java:69)
            at Android.os.Handler.handleCallback(Handler.Java:739)
            at Android.os.Handler.dispatchMessage(Handler.Java:95)
            at Android.os.Looper.loop(Looper.Java:135)
            at Android.app.ActivityThread.main(ActivityThread.Java:5221)
            at Java.lang.reflect.Method.invoke(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:372)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:899)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:694)

Also nullpointer for searchview während ich es habe:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.event_main, menu);

        // Get the SearchView and set the searchable configuration
        // 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 super.onCreateOptionsMenu(menu);
    }

Und in meinem Menü habe ich folgendes:

<!-- Search Widget -->
  <item Android:id="@+id/action_search"
      Android:title="@string/action_search"
      Android:icon="@drawable/ic_action_search"
      app:showAsAction="always"
      Android:actionViewClass="Android.support.v7.widget.SearchView"/>

Ich habe keine Ahnung, warum es nicht mehr funktioniert, aber es ist passiert, seit ich App compat 21 verwendet habe.

Grüße,

62
Laurenswuyts

Versuchen Sie es mit dem benutzerdefinierten app-Namespace auch für Ihre actionViewClass:

app:actionViewClass="Android.support.v7.widget.SearchView"/>
228
Simas

Fügen Sie die folgende Zeile zuproguard-rules.profile im Ordnerapphinzu:

-Steep-Klasse Android.support.v7.widget.SearchView {*; }

39
Darush

Dies kann auch vorkommen, wenn Sie Proguard aktiviert haben und die Klasse SearchView streift. Sie müssen die Proguard-Einstellungen ändern, um die Klasse beizubehalten.

Siehe this question für weitere Details.

15
Parag Sarda

Es ist eine zusätzliche Information zu Simas Antwort. Ich fand dies in einer anderen Antwort ( https://stackoverflow.com/a/33400808/4949671 ) und war sehr wichtig, um meine Ausnahme zu lösen:

Beachten Sie, dass app:actionViewClassNICHT .__ ist. Android:actionViewClass

10

nach einer Weile von "run & error" habe ich eine Lösung gefunden. Sieht aus, als wäre das UI-Element nicht der Grund für den Fehler. Nachdem Sie die Suche auf den QueryListener eingestellt haben, funktioniert sie gut. Hier ist ein Code:

Aktivität, die die Suchleiste enthält:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);

        SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String s) {
                Log.d(TAG, "onQueryTextSubmit ");
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                Log.d(TAG, "onQueryTextChange ");
                return false;
            }
        });

        return true;
    }

searchable.xml

<searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
                                      Android:label="@string/app_name"
                                      Android:hint="@string/search_hint"/>

Und die "SearchBar" in menu.xml

     <item
            Android:id="@+id/search"
            Android:title="@string/search_title"
            Android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
            app:showAsAction="collapseActionView|ifRoom"
            app:actionViewClass="Android.support.v7.widget.SearchView"/>

...

Und nicht zuletzt das manifest (aber das sollte klar sein) ... 

  <activity
        Android:name=".activities.MainActivity"
        Android:label="@string/title_activity_main">
        <meta-data
            Android:name="Android.app.searchable"
            Android:resource="@xml/searchable"/>
    </activity>

weitere Informationen -> Dokumente

10
Martin Pfeffer

Wenn Sie progurd verwenden, müssen Sie die folgende Zeile in proguard-rules.pro hinzufügen

-keep public class Android.support.v7.widget. ** {*; }

oder

-Steep-Klasse Android.support.v7.widget.SearchView {*; }

4
Masum

Wenn Sie Ihre Build-Typen auf diese Weise minimieren, müssen Sie eine einzige Zeile Ihrer Datei 'proguard-rules.pro' hinzufügen. 

buildTypes {
    release {
        debuggable false
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
    }
    debug {
        debuggable true
        minifyEnabled false
        shrinkResources false
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
    }
}

Fügen Sie die Zeile "proguard-rules.pro" hinzu. 

-keep class Android.support.v7.widget.SearchView { *; }
1
Atiar Talukdar

Problem tritt auf, wenn Proguard aktiviert ist. Sie können dieses Problem beheben, indem Sie es den Proguard-Regeln hinzufügen

-Steep-Klasse Android.support.v7.widget.SearchView {*; }

0
jeevraj jangid

Nachdem Sie auf ein Ergebnis geklickt haben, erwartet Ihre App, dass ein Vorgang noch nicht abgeschlossen ist, und versucht, in ein Intent-Argument zu gehen.

SearchView.OnSuggestionListener und return true, die Ihre App darüber informiert, dass der Klickvorgang abgeschlossen ist.

        searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {

            @Override
            public boolean onSuggestionClick(int position) {
                return true;
            }

            @Override
            public boolean onSuggestionSelect(int position) {
                return false;
            }
        });
0