webentwicklung-frage-antwort-db.com.de

Die Suchansicht in der Aktionsleiste funktioniert nicht

Ich bin ziemlich neu in der Entwicklung von Java und Android); und ich habe an einer App gearbeitet, in der ich eine Aktionsleiste mit einem SearchView haben möchte. 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. Ich habe gesucht, aber ich habe nichts hilfreiches gefunden. Vielleicht seid ihr kann mir helfen :)

Das Problem : Ich öffne die Suchansicht so, wie es sollte, aber danach passiert überhaupt nichts, ich habe bemerkt, dass mein searchManager.getSearchableInfo (getComponentName ()) gibt null zurück. Außerdem wird mein Hinweis, den ich gegeben habe, nicht in meinem Suchfeld angezeigt, was mich zu der Annahme veranlasst, dass die App meine searchable.xml möglicherweise 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;
    }
}

searchable.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 ein Link zu dem genannten Projekt, ich wäre unendlich dankbar, wenn mir jemand dabei helfen würde!

Quellcode

66

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

Beim Betrachten der API-Demos-Quelle stellte ich fest, dass die Metadaten "Android.app.searchable" in Ihrer Aktivität "results" und in der Hauptaktivität (oder der Aktivität, in der Sie die SearchView platzieren) enthalten sein müssen, mit der Sie auf die andere verweisen. " 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 Verweise und keine fest codierten Zeichenfolgen sind.

Ich hoffe es löst dein Problem. Ich habe den ganzen Tag gebraucht, um das herauszufinden :(

147
Sloy

Android-Handbücher sagen ausdrücklich:

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

Welches ist in deinem Fall NICHT WAHR. Weil Sie nicht in MainActivity, sondern in SearchableActivity suchen möchten. Das heißt, Sie sollten diese ComponentName-Methode anstelle der getComponentName () -Methode verwenden:

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

Außerdem scheinen sowohl die Attribute Android: hint als auch Android: label [~ # ~] muss [~ # ~] sein Verweise auf Zeichenfolgen in strings.xml. Faul zu sein und die String-Werte hart zu codieren, scheint überhaupt nicht zu funktionieren :)

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 (wie 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>
13
NPike

Wenn Sie Android Studio verwenden,

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

teil funktioniert möglicherweise nicht.

schreibe vollen Paketnamen wie

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

sei vorsichtig mit "xml/searchable.xml". Wenn Sie HARD CODE mit Android:hint Und Android:label Erstellt haben, funktioniert dies nicht. 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"/>
6

Stellen Sie sicher, dass Ihre searchables.xml Datei befindet sich am richtigen Ort (d. h. in Ihrem res/xml/ Ordner) und dass die gleiche Datei keine Fehler enthält - ansonsten werden Sie feststellen, dass (SearchManager)getSystemService(Context.SEARCH_SERVICE).getSearchableInfo(componentName) gibt null zurück, wodurch Ihre Suchfunktionalität beeinträchtigt wird.

(Stellen Sie außerdem sicher, dass Sie componentName in der richtigen Weise festlegen, da das in der Android Anleitung gezeigte Beispiel nur für Suchen und Anzeigen von Suchen in derselben Aktivität gilt. )

2

Es ist eigentlich nicht nötig, den "fehlenden Teil" zu verwenden, wie in den obigen Antworten beschrieben. Diese Methode (mit einem SearchView) funktioniert genau so, wie es die offiziellen Dokumente sagen, bis mit dem Such-Widget . Hier muss eine kleine Änderung vorgenommen werden:

Eigenschaften in einem SearchableInfo werden verwendet, um Beschriftungen, Hinweise und Vorschläge anzuzeigen, Absichten zum Starten von Suchergebnissen und zum Steuern anderer Vorteile wie einer Sprachschaltfläche ( docs ) zu erstellen.

Daher muss das SearchableInfo -Objekt, das wir an SearchView.setSearchableInfo(SearchableInfo s) übergeben, korrekte Verweise auf die Zielaktivität enthalten, die angezeigt werden soll, um die Suchergebnisse anzuzeigen. Dies geschieht durch manuelle Übergabe des ComponentName unserer Zielaktivität. Ein Konstruktor zum Erstellen eines 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 sollen. Beachten Sie, dass:

pkg muss auf den Root-Paketnamen Ihres Projekts verweisen und

cls muss ein vollständig qualifizierter Name der Klasse sein (d. h. 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;
}

Schauen Sie sich je nach Ihren Anforderungen die anderen ComponentName Konstruktoren an.

2
Kedar Paranjape