2015-02-01 9 views
5

Mein Anwendungsfall ist der folgende: In Aktivität A habe ich eine Aktionsleiste mit einer zusammenklappbaren SearchView. Wenn der Benutzer ihre Anfrage gibt und den 'Suchen' Knopf drückt, möchte ich Aktivität B mit den Ergebnissen zeigen. Ich bin nicht zu tun, hier ist mein Code:SearchView in einer Aktivität, Ergebnisse in einer anderen

searchable.xml:

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

Aktivität A:

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

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

    return true; 
} 

AndroidManifest für Aktivität A und B:

<activity 
     android:name=".ActivityA"> 

     <intent-filter> 

      <action android:name="android.intent.action.MAIN"/> 

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

     </intent-filter> 

    </activity> 

    <activity android:name=".ActivityB"> 

     <intent-filter> 

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

     </intent-filter> 

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

    </activity> 

Aber egal, was ich versuche, getSearchableInfo in A gibt immer null zurück.

Ich habe das Gefühl, ich verstehe etwas nicht. Die einzige Möglichkeit, getSearchableInfo() return not null zu erzeugen, besteht darin, den Filter SEARCH Intent und die durchsuchbaren Metadaten in die Aktivität A im Manifest zu schreiben. Aber dann, wenn ich den "Suchen" -Button drücke, wird eine weitere Instanz von Aktivität A erneut über die aktuelle gestartet, was definitiv nicht das ist, was ich möchte. Ich denke, ich könnte singleTop zu A hinzufügen und die Aktion SEARCH in onNewIntent behandeln und B starten, aber ich möchte generell nicht, dass A singleTop ist, ich möchte die Standardeinstellung. Oder tue ich?

ich versuchte, dies zu A im Manifest Zugabe (wie in einigen anderen Threads vorgeschlagen):

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

Was mache ich falsch?

EDIT: Ich ersetzte die 'GetComponentName()' Linie in A mit dem folgenden:

searchView.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, ActivityB.class))); 

und es scheint so, wie ich will zu arbeiten! Mache ich hier etwas falsch oder ist das der richtige Weg? Ich bin ein bisschen unsicher, weil es nirgends erwähnt wird!

+1

Das Dokument sagt 'getSearchableInfo (componentName)' nimmt ein Argument, das 'die Aktivität ist, nach der durchsuchbare Informationen erhalten'. In Ihrem Fall benötigen Sie ActivityB, daher ist das Konstruieren eines 'ComponentName', der auf ActivityB verweist, der richtige Weg. – hidro

+0

@hidro - Ich werde Ihre Antwort akzeptieren, wenn Sie eine schreiben. – wujek

+0

Tausend Dank für diese Frage. Nach vier Stunden verschwendeter Zeit gerettet. – X09

Antwort

13

Nach Android documentations nimmt SearchManager.getSearchableInfo(componentName) ein Argument, das ist:

component: Die Aktivität durchsuchbare Informationen zu erhalten für

In Ihrem Fall Sie ActivityB benötigen, so die Konstruktion eines ComponentName, dass die Punkte zu ActivityB ist der richtige Weg

new ComponentName(this, ActivityB.class) 
+0

Funktioniert perfekt –

+0

Funktioniert wie Magie. Ich kann nicht mehr als eine Aufzählung geben, sonst hätte ich eine Million geben können. – X09

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

dieses Vorsatzes in den Filter-Aktivität A.

2.SearchView Menu

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

xml:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item 
     android:id="@+id/search" 
     android:actionViewClass="android.widget.SearchView" 
     android:icon="@drawable/ic_action_search" 
     android:showAsAction="collapseActionView|always" 
     android:title="@string/search_hint"/> 

</menu> 

3.Call diese Methode aus OnCreate-.

private void handleIntent(Intent intent) { 
     if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
      String query = intent.getStringExtra(SearchManager.QUERY); 

      Debug.e("Suggestion handle click", "call " + query); 

      startNextActivity(query); 

     } 
    } 

4. wenn Sie mit Autosuggestion Listview searchView.setOnQueryTextListener, setOnSuggestionListener und setSuggestionsAdapter implementieren.

+0

Ich möchte nicht, dass A die Suchabsicht bekommt, das ist der ganze Punkt in meiner Frage, tut mir leid, wenn ich nicht klar war. – wujek