webentwicklung-frage-antwort-db.com.de

Starten Sie eine neue Aktivität in SearchView

Ich habe zwei Aktivitäten: Die erste hat eine Aktionsleiste mit einer Suchansicht, die zweite sollte die Ergebnisse der Suchabfrage anzeigen.

androidmanifest:

    <activity
        Android:name=".SearchActivity"

        ...
        Android:launchMode="singleTop">           

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

    </activity>

   <activity
        Android:name=".ResultsActivity"
        ...

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

    </activity>

searchable.xml

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

SearchActivity

....
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_noun_list, menu);

    // Associate searchable configuration with the SearchView
    SearchManager searchManager =  (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView =  (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName()));

    return true;
}
....

ErgebnisseAktivität:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);

    }
...
}

das Problem ist, dass nach Eingabe einer Abfrage in den Suchausblick nichts passiert. Keine Fehler, nichts. Wie kann ich die Ergebnisaktivität öffnen, nachdem die Abfrage in die Suchaktivität eingegeben wurde?

15
Maarten

Diese Antwort ist etwas spät, aber ich denke, sie wird für zukünftige Zuschauer nützlich sein. Das Dilemma scheint auf die Mehrdeutigkeit des Android SearchView-Tutorials zurückzuführen zu sein. Das Szenario, das sie abdecken, setzt voraus, dass Sie die Ergebnisse in derselben Aktivität anzeigen, in der sich SearchView befindet. In einem solchen Szenario würde das Activity-Tag in der Datei AndroidManifest.xml in etwa wie folgt aussehen:

<activity
    Android:name=".MainActivity"
    Android:label="@string/main_activity_label"
    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" />
</activity>

Um die Ergebnisse in derselben Aktivität zu behandeln, würden Sie die onNewIntent-Methode überschreiben:

@Override
public void onNewIntent(Intent intent){
    setIntent(intent);
    if(Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        //now you can display the results
    }  
}

In einer Situation, in der die Ergebnisse in einer anderen Aktivität angezeigt werden sollen, müssen wir den Intent-Filter und das Meta-Tag in die Ergebnisaktivität aufnehmen und ein neues Meta-Tag für die SearchView-Aktivität einführen. In der AndroidManifest.xml-Datei sehen unsere Aktivitäten in etwa folgendermaßen aus:

<activity
        Android:name=".MainActivity"
        Android:label="@string/main_activity_label"
        Android:launchMode="singleTop">
        <!-- meta tag points to the activity which displays the results -->
        <meta-data
            Android:name="Android.app.default_searchable"
            Android:value=".SearchResultsActivity" />
</activity>
<activity
        Android:name=".SearchResultsActivity"
        Android:label="@string/results_activity_label"
        Android:parentActivityName="com.example.MainActivity">
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value="com.example.MainActivity" />
        <!-- meta tag and intent filter go into results activity -->
        <meta-data Android:name="Android.app.searchable"
            Android:resource="@xml/searchable" />
        <intent-filter>
            <action Android:name="Android.intent.action.SEARCH" />
        </intent-filter>
</activity>

Aktivieren Sie anschließend in der Methode onCreateOptionsMenu unserer MainActivity-Methode die Suchansicht (vorausgesetzt, Sie fügen die Suchansicht der Aktionsleiste hinzu). Anstatt getComponentName() im Aufruf der Methode searchSearch der Methode searchSearch () zu verwenden, instantiieren wir ein neues ComponentName-Objekt mit dem Kontext von MainActivity und der Klasse SearchResultsActivity:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_home, menu);
    SearchView search = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search);
    // Associate searchable configuration with the SearchView
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    search.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, SearchResultsActivity.class)));
    search.setQueryHint(getResources().getString(R.string.search_hint));
    return true;
}

Schließlich können wir in der Klasse SearchResultsActivity in der Methode onCreate die Suchergebnisse behandeln:

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        //use the query to search your data somehow
    }
}

Vergessen Sie nicht , um die Ressourcendatei searchable.xml zu erstellen und die SearchView zu Ihrem Layout hinzuzufügen.

searchable.xml (res/xml/searchable.xml; ggf. XML-Ordner unter res erstellen):

<?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:voiceSearchMode="showVoiceSearchButton|launchRecognizer"/>

Layout (Beispiel für das Hinzufügen von SearchView zu ActionBar als Menüelement):

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    tools:context="com.example.MainActivity">
    <group Android:checkableBehavior="single">
        <item Android:id="@+id/action_search" Android:title="Search"
            Android:orderInCategory="1" app:showAsAction="collapseActionView|ifRoom"
            app:actionViewClass="Android.support.v7.widget.SearchView"/>
    </group>
</menu>

Ressourcen:

28
chRyNaN

Ich verstand das Problem, mit dem ich ebenfalls konfrontiert war. Dies geschieht, weil Sie den aktuellen Komponentennamen übergeben, indem Sie den

getComponentName ()

Dies wird durch den aktuellen Aktivitätsnamen initialisiert. Sie müssen ihn also mit dem durchsuchbaren Aktivitätsnamen im angegebenen Format initialisieren und dieselbe Komponenteninstanz übergeben, mit der die neue Aktivität beginnt.

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    search.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, SearchResultsActivity.class)));
    search.setQueryHint(getResources().getString(R.string.search_hint));

Hoffe ich habe die Frage beantwortet!

0

Ohne Ihren Aktivitätscode zu sehen, würde ich vorschlagen, dass Sie diesen Ansatz versuchen - auch vorausgesetzt, Sie haben alle Dateien wie oben angegeben erstellt.

In Ihrer Ergebnisaktivität

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

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

    searchView.setIconifiedByDefault(false);
    searchView.setQueryHint(getString(R.string.search_hint));

    searchView.setOnQueryTextListener(this);

    return true;
}

Denken Sie daran, dass dies die Aktivität ist, in der Ihre Daten durchsuchbar sind:

Sie müssen die Schnittstelle " SearchView.OnQueryTextListener " in derselben Aktivität implementieren:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_search:
            ProductsResulstActivity.this.finish();

            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public boolean onQueryTextSubmit(String query) {
    return false;
}

@Override
public boolean onQueryTextChange(String newText) {

    productFilterAdapter.getFilter().filter(newText);

    if (TextUtils.isEmpty(newText)) {
         listView.clearTextFilter();
     }
    else {
       listView.setFilterText(newText);
    }

    return true;
}

productFilterAdapter ist der Adapter, den Sie zuvor erstellen müssen.

Es sollte eine filterable Schnittstelle implementiert werden. Ich hoffe das hilft.

Wenn Sie weitere Hilfe benötigen, lassen Sie es mich wissen. Viel Glück

0
Eenvincible