11

Estoy tratando de obtener sugerencias para SearchView. Implementé un proveedor de contenido personalizado para él. También me he referido a este link para implementar sugerencias para SearchView. El problema que estoy enfrentando es, consigo valor nulo en searchManager.getSearchableInfo(getComponentName())Android: getSearchableInfo (getComponentName()) devolviendo nulo?

Éstos son los fragmentos:

AndroidManifest.xml

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 

    <provider android:name=".SearchProvider" 
     android:enabled="true" 
     android:authorities="com.example.currentlocationmapdemo" 
     android:grantUriPermissions="true" 
     android:exported="true"> 
     <grant-uri-permission android:pathPattern="*" /> 
    </provider> 
    <uses-library android:name="com.google.android.maps" /> 

    <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.searchable" 
      android:resource="@xml/searchable"/> 
    </activity> 

searchable.xml

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
android:label="label" 
android:hint="hint" 
android:searchSuggestAuthority="com.example.currentlocationmapdemo" 
android:searchSuggestSelection=" ? "> 

MainActivity

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.searchview_in_menu, menu); 
    MenuItem searchItem = menu.findItem(R.id.action_search); 
    mSearchView = (SearchView) searchItem.getActionView(); 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
SearchableInfo info = searchManager.getSearchableInfo(getComponentName()); // null returned 
mSearchView.setSearchableInfo(info); 

return true; 
} 

Respuesta

17

Al menos una de sus actividades - la persona que está haciendo la la búsqueda de es suficiente - debe tener este filtro intención de que en el manifiesto:

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

Si no, entonces searchManager.getSearchableInfo(getComponentName()) siempre devuelve un valor nulo, y la configuración se ignora.

Esto me mató por un día, pensé que era relacionado con ActionBarSherlock, pero no funciona bien con eso. El problema era que estaba intentando cortocircuitar la muestra, como también lo has hecho :-)

+1

Como nota, actualmente SÓLO puedo hacerlo funcionar si el filtro de intención está en la actividad actual. Es bastante agravante, porque me gustaría ir a otra actividad para mostrar los resultados de búsqueda. Si sabes qué pasa con eso, estaría agradecido de escuchar. – Erhannis

+0

Horas perdidas en esto. Fue el filtro de intención que faltaba. –

8

Creo que su enfoque es erróneo. Debería tener 2 actividades: 1: actividad principal que tiene como SearchView (en ActionBar o diseño) y 2: SearchActivity que se iniciará cuando se realice la búsqueda.

Quizás también puedas hacerlo así pero no estoy seguro. ¿Dónde le gustaría recibir ACTION_SEARCH en su enfoque? Normalmente se hace eso en OnCreate en su searchActivity así:

Intent intent = getIntent(); 
if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
    String query = intent.getStringExtra(SearchManager.QUERY); 
    System.out.println("searching for: " + query); 
} 

lo hice en dos actividades y funcionó para mí. Una cosa adicional que tenía que hacer y que no encontrar en Android Buscar tutorial fue añadiendo:

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

en el manifiesto para mi MainActivity

+0

Mi implementación fue realmente correcta. El problema fue muy tonto. Me había perdido la ' ' en menu.xml. Sin embargo, el archivo xml no mostró ningún error. – FireAndIce

+4

El atributo 'default_searchable' es lo único que NO está oficialmente documentado. ¡Gracias! Me volvió loco. La documentación de Android es una broma. – EinLama

Cuestiones relacionadas