2015-02-01 6 views
5

Il mio caso d'uso è il seguente: nell'attività A, ho una barra delle azioni con un SearchView comprimibile. Quando l'utente fa la sua domanda e preme il pulsante 'cerca', mi piacerebbe mostrare l'attività B con i risultati. Sto riuscendo a farlo, qui è il mio codice:SearchView in una attività, ne restituisce un'altra

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"/> 

Attività 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 per attività A e 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> 

Howerver, qualunque cosa provi, getSearchableInfo in A restituisce sempre null.

Ho la sensazione che non capisco qualcosa. L'unico modo per rendere getSearchableInfo() return non nullo è quando inserisco il search filter e i meta-data ricercabili nell'attività A nel manifest. Ma poi, quando premo il pulsante 'cerca', un'altra istanza dell'attività A viene riavviata in cima a quella corrente, che sicuramente non è ciò che voglio. Suppongo di poter aggiungere singleTop ad A e gestire l'azione SEARCH in onNewIntent e avviare B, ma generalmente non voglio che A sia singleTop, voglio il default. O io?

Ho provato ad aggiungere ad un nel manifesto (come suggerito in alcuni altri thread):

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

Che cosa sto facendo di sbagliato?

EDIT: ho sostituito il 'getComponentName) (' la linea in A con il seguente:

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

e sembra funzionare nel modo desiderato! Sto facendo qualcosa di sbagliato qui, o è questo il modo corretto? Sono un po 'incerto perché non è menzionato da nessuna parte!

+1

Il documento dice 'getSearchableInfo (componentName)' accetta un argomento, che è 'l'attività per ottenere informazioni ricercabili per'. Nel tuo caso hai bisogno di ActivityB, quindi costruire un 'ComponentName' che punti a ActivityB è il modo corretto. – hidro

+0

@hidro - Accetterò la tua risposta se ne scrivi una. – wujek

+0

Grazie mille per aver fatto questa domanda. Salvato dopo quattro ore di tempo perso. – X09

risposta

13

Secondo Android documentations, SearchManager.getSearchableInfo(componentName) prende un argomento, che è:

componentName: L'attività per ottenere informazioni ricercabile per

Nel tuo caso è necessario ActivityB, in modo da costruire un ComponentName che i punti a ActivityB è il modo corretto

new ComponentName(this, ActivityB.class) 
+0

Funziona perfettamente –

+0

Funziona come per magia. Non posso dare più di un altro voto che avrei potuto dare un milione. – X09

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

aggiungere questo filtro intento di attività 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 questo metodo da 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. se si utilizza Autosuggestion Listview implementare searchView.setOnQueryTextListener, setOnSuggestionListener e setSuggestionsAdapter.

+0

Non voglio A per ottenere l'intento di ricerca, questo è l'intero punto della mia domanda, mi dispiace se non sono stato chiaro. – wujek