it-swarm.com.de

Wie füge ich ein SearchWidget zur ActionBar hinzu?

Ich versuche, meiner Anwendung eine Search-ActionView hinzuzufügen (wie hier http://developer.Android.com/guide/topics/search/search-dialog.html#UsingSearchWidget ). Leider bekomme ich immer eine NullPointerException und es fällt mir schwer zu erkennen, was wirklich schief läuft.

Ich habe eine durchsuchbare Konfiguration und eine durchsuchbare Aktivität erstellt, wie auf der Android-Seite angezeigt. Meine .xml-Datei sieht folgendermaßen aus:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    ...
    <item
        Android:id="@+id/menu_item_search"
        Android:actionViewClass="Android.widget.SearchView"
        Android:icon="@drawable/icon_search"
        Android:showAsAction="always"
        Android:title="@string/action_bar_button_search">
    </item>

</menu>

Dies ist die Methode, bei der die Ausnahme ausgelöst wird:

public boolean onCreateOptionsMenu( Menu menu )
{
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate( R.menu.action_bar, menu );

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_item_search).getActionView();

    // NullPointerException thrown here; searchView is null.
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false);

    return super.onCreateOptionsMenu( menu );
}

Komplette Stack-Trace:

FATAL EXCEPTION: main
Java.lang.NullPointerException
at com.example.activities.Test.onCreateOptionsMenu(Test.Java:41)
at Android.app.Activity.onCreatePanelMenu(Activity.Java:2444)
at com.Android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.Java:408)
at com.Android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.Java:759)
at com.Android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.Java:2997)
at Android.os.Handler.handleCallback(Handler.Java:605)
at Android.os.Handler.dispatchMessage(Handler.Java:92)
at Android.os.Looper.loop(Looper.Java:137)
at Android.app.ActivityThread.main(ActivityThread.Java:4507)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:511)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:790)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:557)
at dalvik.system.NativeStart.main(Native Method)
26
Taig

verwenden Sie diesen Weg wie in link

public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.action_bar, menu);
        MenuItem searchItem = menu.findItem(R.id.menu_item_search);
        SearchView searchView = (SearchView) searchItem.getActionView();


        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        if(null!=searchManager ) {   
         searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        }
        searchView.setIconifiedByDefault(false);

        return true;
    }
20
Dheeresh Singh

Da diese Frage ziemlich oft nachgesehen wird und ich immer wieder über dasselbe Problem gestolpert bin, folgt hier ein kleines Follow-up, in dem alle notwendigen Schritte zur Erstellung eines SearchWidget nachverfolgt werden.

Es gibt jedoch einen kniffligen Teil über SearchWidget: Wenn Sie anstelle von Ressourcen hartcodierte Strings in searchable.xml verwenden, stürzt die App mit einer verwirrenden Fehlermeldung ab. Das hat mich zu viele Stunden meines Lebens gekostet ...

  1. Erstellen Sie eine Aktivität, um die Suchergebnisse zu bearbeiten

    public class Search extends Activity {}
    
  2. Fügen Sie Ihrem res/xml-Verzeichnis eine Datei "searchable.xml" hinzu ( Ressourcen für Hinweis und Beschriftung verwenden! )

    <searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:hint="@string/search_hint"
        Android:includeInGlobalSearch="false"
        Android:label="@string/search_label"
        Android:searchSettingsDescription="@string/search_global_description" />
    
  3. Erstellen Sie den richtigen Menüeintrag "main.xml" im Verzeichnis res/menu

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    
        <item
           Android:id="@+id/options_menu_main_search"
           Android:actionViewClass="Android.widget.SearchView"
           Android:icon="@drawable/icon_magnifier"
           Android:showAsAction="always"
           Android:title="Search"/>
    
    </menu>
    
  4. Aktualisieren Sie Ihre Manifest.xml: Fügen Sie die Suchaktivität hinzu und geben Sie an, welche Aktivitäten Suchabsichten erhalten können. Durch Hinzufügen von <meta-data Android:name="Android.app.default_searchable" Android:value=".app.Search" /> zu einem activity-Knoten kann er durchsucht werden. Durch Hinzufügen zum Knoten application können alle Aktivitäten durchsucht werden.

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:Android="http://schemas.Android.com/apk/res/Android">
        <application>
            <meta-data
                Android:name="Android.app.default_searchable"
                Android:value=".app.Search" />
    
            <activity Android:name=".activities.Search" >
                <intent-filter>
                <action Android:name="Android.intent.action.SEARCH" />
            </intent-filter>
    
            <meta-data
                Android:name="Android.app.searchable"
                Android:resource="@xml/searchable" />
        </activity>
    </application>
    

  5. Fügen Sie den SearchManager zu Ihrer ActionView in jeder Aktivität hinzu, die das SearchWidget bereitstellen soll

    public class Activity extends Android.app.Activity
    {
        @Override
        public boolean onCreateOptionsMenu( Menu menu )
        {
            getMenuInflater().inflate( R.menu.main, menu );
    
            // Add SearchWidget.
            SearchManager searchManager = (SearchManager) getSystemService( Context.SEARCH_SERVICE );
            SearchView searchView = (SearchView) menu.findItem( R.id.options_menu_main_search ).getActionView();
    
            searchView.setSearchableInfo( searchManager.getSearchableInfo( getComponentName() ) );
    
            return super.onCreateOptionsMenu( menu );
        }
    }
    
49
Taig

Wenn Sie Targeting Android 2.x verwenden und Android.support.v7.widget.SearchView Verwenden, überprüfen Sie, ob Ihre menu.xml so aussieht (beachten Sie den yourapp namespace).

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:yourapp="http://schemas.Android.com/apk/res-auto">
    <item
        Android:id="@+id/search"
        Android:title="@string/search"
        Android:icon="@drawable/ic_search"
        yourapp:showAsAction="always"
        yourapp:actionViewClass="Android.support.v7.widget.SearchView" />
</menu>

Und in der Aktivität, in der Sie das Menü aufblasen, verwenden Sie:

Android.support.v7.widget.SearchView searchView = (Android.support.v7.widget.SearchView) 
MenuItemCompat.getActionView(menu.findItem(R.id.search));
24
peceps

SearchView getActionView gibt null zurück

Öffnen Sie wie im Link Ihre Menü-XML-Datei und ändern Sie sie 

Android:actionViewClass="Android.widget.SearchView"

in 

app:actionViewClass="Android.widget.SearchView" 

das hat für mich funktioniert

7
QuinnX

Ich habe auch das gleiche Problem. Ändern Sie in meinem Fall Android:actionViewClass in app:actionViewClass das Problem (Mit xmlns:app="http://schemas.Android.com/apk/res-auto" im Tag <menu>).

2
stenlytw

Erstellen Sie zunächst eine XML-Datei, die das SearchWidget enthält, in Ihrem Layoutordner

<?xml version="1.0" encoding="utf-8"?>
<SearchView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/edit_query"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:inputType="textFilter"
    >

</SearchView>

Rufen Sie dann in Ihrer Aktivität die Aktionsleiste ab

Android.support.v7.app.ActionBar actionBar = getSupportActionBar();

Fügen Sie dann einen Verweis auf Ihre Suchansicht hinzu

 actionBar.setCustomView(R.layout.custom_action_bar);
    search = (EditText) actionBar.getCustomView().findViewById(
            R.id.edit_query);

Stellen Sie dann die Anzeigeoption für die Aktionsleiste ein

actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_HOME_AS_UP);

Das ist es. 

Übrigens, Sie könnten auch mein search widget verwenden, das eine Liste von Strings als Array-Liste nimmt und diese entsprechend der eingegebenen Abfrage anzeigt. Wenn der Benutzer ein bestimmtes Ergebnis auswählt, wird das ausgewählte Ergebnis zurückgegeben, das im onActivityResult der übergeordneten Aktivität abgerufen werden kann. 

0
Riya Gayasen

Dieses Problem wird durch einen Filter für fehlende Absichten ausgelöst:

<intent-filter>
    <action Android:name="Android.intent.action.SEARCH" />
</intent-filter>
0
tpbapp