Kann die Suchansicht in der Aktionsleiste nicht zum Laufen bringen

Lesezeit: 9 Minuten

Kann die Suchansicht in der Aktionsleiste nicht zum Laufen bringen
Jonathan Andersson

Ich bin ziemlich neu in der Java- und Android-Entwicklung; und ich habe an einer App gearbeitet, in der ich eine Aktionsleiste mit einem haben möchte SearchView. Ich habe mir die Google-Beispiele angesehen, aber ich kann es nicht zum Laufen bringen. Ich muss etwas falsch machen und bin dabei, die App-Entwicklung aufzugeben :DI habe gesucht, aber ich habe nichts Hilfreiches gefunden. Vielleicht könnt ihr mir helfen 🙂

Das Problem: Ich bekomme die Suchansicht so geöffnet, wie sie sollte, aber danach passiert überhaupt nichts, ich habe bemerkt, dass meine searchManager.getSearchableInfo(getComponentName()) gibt null zurück. Auch mein Hinweis, den ich gegeben habe, wird nicht in meinem Suchfeld angezeigt, was mich zu der Annahme führt, dass die App meine searchable.xml vielleicht nicht finden kann? Genug Gerede 🙂

MainActivity.java

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

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

        // Get the SearchView and set the searchable configuration
        SearchManager searchManager =
            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
            (SearchView) menu.findItem(R.id.menu_search).getActionView();
        searchView.setSearchableInfo(
            searchManager.getSearchableInfo(getComponentName()));

        return true;
    }
}

durchsuchbar.xml

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="@string/search_hint"
    android:label="@string/app_label">
</searchable>

Androidmanifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.searchapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity android:name=".SearchableActivity" >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
        </activity>

        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>           
        </activity>

        <meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>          

    </application>

</manifest>

SearchableActivity.java

package com.example.searchapp;

import android.app.ListActivity;
import android.app.SearchManager;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class SearchableActivity extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search);

        // Get the intent, verify the action and get the query
        Intent intent = getIntent();
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
          String query = intent.getStringExtra(SearchManager.QUERY);
          doMySearch(query);
        }
    }

    private void doMySearch(String query) {
        Log.d("Event",query);
    }
}

Und hier ist ein Link zu dem genannten Projekt, ich wäre unendlich dankbar, wenn mir jemand dabei helfen würde!

Quellcode

  • menu.findItem (R.id.menu_search) – wie wurde das kompiliert? Was ist R.id.menu_search?

    – AlikElzin-kilaka

    2. Mai 2013 um 13:51 Uhr

  • wie Sie die Suche in der Suchaktivität fortsetzen. So stellen Sie die actionBar-Suchansicht in der Suchaktivität erneut ein, um in derselben Aktivität mehr zu suchen.

    – Madan V

    1. November 2013 um 19:19 Uhr

  • Ich brauche Hilfe stackoverflow.com/questions/32197791/…

    – Aditya Vyas-Lakhan

    26. August 2015 um 6:03 Uhr

Ihr Problem liegt in Ihrem AndroidManifest. Ich hatte es fast genau so wie Sie, denn das bekomme ich nach der Dokumentation. Aber es ist unklar oder falsch.

Als ich mir die API-Demos-Quelle ansah, stellte ich fest, dass die Metadaten „android.app.searchable“ in Ihre „Ergebnis“-Aktivität gehen müssen, und in der Hauptaktivität (oder der Aktivität, in der Sie die SearchView platzieren) zeigen Sie auf die andere mit „ android.app.default_searchable”.

Sie können es in der folgenden Datei sehen, die das Manifest aus meinem Testprojekt ist:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <meta-data
            android:name="android.app.default_searchable"
            android:value=".SearchActivity" />
    </activity>
    <activity
        android:name=".SearchActivity"
        android:label="@string/app_name" >

        <!-- This intent-filter identifies this activity as "searchable" -->

        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

        <!-- This metadata entry provides further configuration details for searches -->
        <!-- that are handled by this activity. -->

        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
    </activity>
</application>

Es ist auch wichtig, dass der Hinweis und die Bezeichnung in der searchable.xml Referenzen und keine hartcodierten Zeichenfolgen sind.

Ich hoffe, es löst Ihr Problem. Ich habe den ganzen Tag gebraucht, um es herauszufinden 🙁

  • Es hat total funktioniert! Also war es nicht nur ich, denke ich 🙂 Ich bin jetzt ein glücklicher Camper, danke Sloy! 🙂

    – Jonathan Andersson

    29. Juli 2012 um 6:20 Uhr


  • Dieser Beitrag hat uns gerade gerettet – das fehlende Teil war <meta-data android:name="android.app.default_searchable" android:value=".SearchActivity" />

    – Richard Lewin

    1. Dezember 2012 um 20:15 Uhr

  • Es ist die Android Dev-Dokumentation, die unklar ist, und diese Antwort hat mich davor bewahrt, viel Code zu implementieren. Danke!

    – jaibatrik

    30. März 2013 um 18:17 Uhr

  • Es ist auch wichtig, dass der Hinweis und die Bezeichnung in der searchable.xml Referenzen und keine hartcodierten Zeichenfolgen sind. .. das hat mein Problem behoben. Das ist ein sehr lächerlicher Fehler.

    – Indrek Kõue

    14. Juni 2013 um 18:57 Uhr

  • Ich hatte das gleiche Problem und habe herausgefunden, was zu tun ist. Ich habe länger gebraucht als erwartet, da das offizielle Dokument mehrere Fehler enthält. Es wurde mehrfach in StackOverflow gestellt – ich habe mindestens 5 Posts gefunden, in denen dieselbe Frage gestellt wurde. Ich habe sie als Duplikate zu diesem markiert. ich auch hat einen Blog geschrieben um zusammenzufassen, was ich gelernt habe. Ich hoffe es hilft.

    – Clint

    3. Juli 2014 um 22:23 Uhr


Android Guides sagt ausdrücklich:

// Assumes current activity is the searchable activity
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

Was in Ihrem Fall NICHT WAHR ist. Weil Sie nicht in MainActivity, sondern in SearchableActivity suchen möchten. Das bedeutet, dass Sie diesen ComponentName anstelle der Methode getComponentName() verwenden sollten:

ComponentName cn = new ComponentName(this, SearchableActivity.class);
searchView.setSearchableInfo(searchManager.getSearchableInfo(cn));

  • Sehr gut. Es dauert Stunden, um es herauszufinden. Danke

    – Berkay Turanci

    15. Januar 2015 um 20:29 Uhr

  • Ich habe das Ausschneiden und Einfügen durchgeführt und wusste nicht, dass die Dokumente dies sagten. Danke!

    – Strahlenjäger

    4. April 2015 um 21:11 Uhr

  • danke! Das ist wirklich der Fehler, den ich gemacht habe

    – Randy

    27. April 2015 um 5:32 Uhr

  • Hilfe hier stackoverflow.com/questions/32197791/…

    – Aditya Vyas-Lakhan

    26. August 2015 um 6:03 Uhr

  • Dies löst das Problem, aber das Suchsymbol in der Tastatur wird jetzt durch einen Pfeil ersetzt. Wie bekomme ich es zurück?

    – Iqbal

    22. Februar 2016 um 12:15 Uhr

Es scheint auch, dass sowohl die Attribute android:hint als auch android:label MUSS Referenzen auf Strings in strings.xml sein. Faul zu sein und die Stringwerte fest zu codieren scheint überhaupt nicht zu funktionieren 🙂

dh nicht tun:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="Search for something..."
    android:label="My App">
</searchable>

Aber auf jeden Fall tun (wie es das OP richtig gemacht hat):

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="@string/search_hint"
    android:label="@string/app_label">
</searchable>

  • Ist das ein Fehler oder ist das eine spezifische technologische Einschränkung? Für mich scheint es ein Fehler zu sein (in der Dokumentation wird nicht erwähnt, dass Sie keine fest codierten Zeichenfolgen verwenden können).

    – Indrek Kõue

    14. Juni 2013 um 19:43 Uhr

  • Danke dafür. Ich habe 2 Tage verschwendet, bevor ich das herausgefunden habe.

    – Laschra

    25. Juni 2016 um 2:09 Uhr

Wenn Sie Android Studio verwenden,

<meta-data
            android:name="android.app.default_searchable"
            android:value=".SearchActivity" />

Teil funktioniert möglicherweise nicht.

Schreiben Sie den vollständigen Paketnamen wie

<meta-data
                android:name="android.app.default_searchable"
                android:value="com.example.test.SearchActivity" />

Seien Sie vorsichtig mit “xml/searchable.xml”. Wenn du HARD CODE mit gemacht hast android:hint und android:label.Es wird nicht funktionieren. Haha sollte sein:

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="@string/app_name"
android:label="@string/search_lb"
android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"/>

  • so seltsam. ist das ein fehler?

    – Tanner Sommer

    23. September 2017 um 5:29 Uhr

Kann die Suchansicht in der Aktionsleiste nicht zum Laufen bringen
Kedar Paranjape

Es besteht eigentlich keine Notwendigkeit, den “fehlenden Teil” zu verwenden, wie in den Antworten oben beschrieben. Diese Methode (unter Verwendung einer SearchView) funktioniert genau so, wie es die offiziellen Dokumente bis sagen Verwenden des Such-Widgets. Hier muss eine kleine Modifikation wie folgt vorgenommen werden:

Eigenschaften in a SearchableInfo werden verwendet, um Labels, Hinweise und Vorschläge anzuzeigen, Absichten zum Starten von Suchergebnisseiten zu erstellen und andere Angebote wie eine Sprachtaste zu steuern (Dokumente).

Und so kam es dass der SearchableInfo Objekt übergeben wir an die SearchView.setSearchableInfo(SearchableInfo s) muss korrekte Verweise auf die Zielaktivität enthalten, die angezeigt werden soll, um die Suchergebnisse anzuzeigen. Dies geschieht durch manuelles Passieren der ComponentName unserer Zieltätigkeit. Ein Konstruktor zum Erstellen von a ComponentName ist

public ComponentName (String pkg, String cls)

pkg und cls sind Paketnamen und Klassennamen der Zielaktivität, die zum Anzeigen von Suchergebnissen gestartet werden soll. Beachten Sie, dass:

pkg muss auf den Root-Paketnamen Ihres Projekts verweisen und

cls muss ein vollständig qualifizierter Name der Klasse sein (dh das Ganze)

z.B:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    // Get the SearchView and set the searchable configuration
String pkg = "com.example.musicapp"
String cls = "com.example.musicapp.search.SearchActivity"
ComponentName mycomponent = new ComponentName(pkg,cls);       
SearchManager searchManager =(SearchManager)getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(mycomponent));
searchView.setIconifiedByDefault(false);   //if using on actionbar
return true;
}

Sehen Sie sich je nach Bedarf die anderen an ComponentName Konstrukteure.

  • so seltsam. ist das ein fehler?

    – Tanner Sommer

    23. September 2017 um 5:29 Uhr

1645915389 445 Kann die Suchansicht in der Aktionsleiste nicht zum Laufen bringen
Ban-Geoengineering

Stellen Sie sicher, dass Ihre searchables.xml Datei befindet sich am richtigen Ort (dh in Ihrer res/xml/ Ordner) und dass die gleiche Datei keine Fehler enthält – sonst werden Sie das finden (SearchManager)getSystemService(Context.SEARCH_SERVICE).getSearchableInfo(componentName) wird null zurückgeben und Ihre Suchfunktion unterbrechen.

(Stellen Sie außerdem sicher, dass Sie eingestellt sind componentName in geeigneter Weise, da das im Android-Handbuch gezeigte Beispiel nur gilt, wenn Sie Suchen durchführen und Suchen in derselben Aktivität anzeigen.)

869040cookie-checkKann die Suchansicht in der Aktionsleiste nicht zum Laufen bringen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy