2012-12-22 15 views
8

Ho impostato un SearchWidget come descritto nello Android API Guide. Visualizza correttamente un'icona a forma di lente di ingrandimento nella barra delle azioni e se faccio clic su di essa, avvia il widget di ricerca all'interno della barra delle azioni (un campo di input con uno sfondo scuro).Mostra SearchWidget in ActionBar se l'utente preme il pulsante di ricerca del dispositivo

Tuttavia, se si preme il pulsante di ricerca del dispositivo virtuale, viene avviato un campo di ricerca diverso: ha uno sfondo bianco e non richiama i metodi di callback specificati.

così ho aggiunto questo per la mia classe MainActivity:

public boolean onSearchRequested() { 
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); 
    searchView.setIconified(!searchView.isIconified()); 
    return false; 
} 

Il set up del widget di ricerca è esattamente lo stesso che è descritto nella documentazione:

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); 
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
searchView.setIconifiedByDefault(false); 
searchView.setOnQueryTextListener(new CustomSearchQueryTextListener()); 

mio searchable.xml :

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

E AndroidManifest.xml:

<activity 
     android:name="MainActivity" 
     android:label="@string/app_name" 
     android:launchMode="singleTask" 
     android:uiOptions="splitActionBarWhenNarrow" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 
     <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> 
    </activity> 

Il motivo per cui ho provato la setIconfied() il metodo è che nel API Android Guida si dice in "La possibilità di attivare o disattivare la visibilità casella di ricerca":

"Per impostazione predefinita, il widget di ricerca è "iconificato", ovvero è rappresentato solo da un'icona di ricerca (una lente di ingrandimento) e si espande in mostra la casella di ricerca quando l'utente lo tocca. Come mostrato sopra, è possibile mostrare la casella di ricerca per impostazione predefinita, chiamando setIconifiedByDefault (false). È inoltre possibile attivare o disattivare la ricerca widget di aspetto chiamando setIconified() "

Ho anche provato a chiamare startSearch("", false, null, false); ma questo fa apparire lo stesso campo di ricerca con lo sfondo bianco

Quindi la mia domanda è..: È possibile avviare il widget di ricerca all'interno della barra delle azioni se l'utente preme il pulsante di ricerca del dispositivo, ovvero peform esattamente la stessa azione come se si fa clic sulla voce del menu di ricerca?

risposta

10

Mentre scrivevo questa domanda mi è venuta in mente la soluzione ho deciso di postarlo insieme alla risposta, perché non sembra come questa domanda è stata posta prima su SO e forse qualcuno incontra lo stesso problema e/o trova una soluzione migliore.

Tutto quello che dovete fare è chiamare expandActionView() sulla voce di menu di ricerca, e tutto funziona come previsto:

public boolean onSearchRequested() { 
    menu.findItem(R.id.menu_search).expandActionView(); 
    return true; 
}