2010-04-25 20 views
13

He seguido la documentación de SearchManager y sigo teniendo problemas para realizar búsquedas en una de las actividades de mi aplicación. Desde mi actividad, aparece el cuadro de diálogo Buscar, entro en una consulta, búsqueda golpeado, mi actividad se vuelve a abrir, entonces veo esto en el registro:¿Por qué la actividad de búsqueda de Intent.getAction() es nula?

D/SearchDialog( 584): launching Intent { act=android.intent.action.SEARCH flg=0x10000000 cmp=com.clinkybot.geodroid2/.views.Waypoints (has extras) } 
I/SearchDialog( 584): Starting (as ourselves) #Intent;action=android.intent.action.SEARCH;launchFlags=0x10000000;component=com.clinkybot.geodroid2/.views.Waypoints;S.user_query=sdaf;S.query=sdaf;end 
I/ActivityManager( 584): Starting activity: Intent { act=android.intent.action.SEARCH flg=0x10000000 cmp=com.clinkybot.geodroid2/.views.Waypoints (has extras) } 
D/WAYPOINTS(1018): NI Intent { cmp=com.clinkybot.geodroid2/.views.Waypoints (has extras) } 
D/WAYPOINTS(1018): NI null 
D/WAYPOINTS(1018): NI false 

Me parece que todo está bien hasta los últimos tres líneas . Las líneas "NI" son getIntent().toString(), getIntent().getAction() y getIntent().hasExtra(SearchManager.QUERY) respectivamente.

ActivityManager parece estar comenzando mi actividad con la acción correcta. ¡Entonces cuando mi actividad comienza, no contiene ninguna acción !? ¿Qué estoy haciendo mal?

La parte pertinente de mi manifiesto es:

<activity android:name=".views.Waypoints" android:label="Waypoints" android:launchMode="singleTop"> 
    <intent-filter> 
    <action android:name="android.intent.action.SEARCH" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
    <meta-data android:name="android.app.searchable" 
    android:resource="@xml/searchable" /> 
    </activity> 

Respuesta

15

que ha tomado muchas horas de mi vida. Al realizar una búsqueda desde la actividad SingleTop que se puede buscar (en mi caso, Waypoints), debe anular onNewIntent() y tomar la consulta de búsqueda allí. Que después de unas horas, lo estaba haciendo. El inconveniente fue que getIntent() no devuelve el Intento utilizado para llamar a la actividad (headstakes). Parece devolver el Intento original que abrió mi actividad de búsqueda antes de realizar mi primera búsqueda .

El onNewIntent method recibe el intento de búsqueda. Reemplacé getIntent() con el parámetro de onNewIntent() y boom, progress.

Aunque debo admitirlo; resolver esto alivia la frustración de no poder escapar del sonido de Bailando con las estrellas a todo volumen en el fondo.

+0

Estoy contento de haber encontrado esta pregunta antes de que mi cabeza explotara también. Esto se menciona en la guía Fundamentos de la aplicación, pero maldita sea sería bueno tener una mención de onNewIntent en [Intención # FLAG_ACTIVITY_SINGLE_TOP] (http://j.mp/gkTnyw) en lugar de solo en [Intención # FLAG_ACTIVITY_CLEAR_TOP] (http://j.mp/fNlEM3). Además, la documentación de [Activity # getIntent] (http://j.mp/ftcS6p) ni siquiera menciona nada. Ugh ... Dicho esto, gracias. – brack

+1

Así que tal vez sería una buena práctica llamar siempre a NewIntent (getIntent()) desde onCreate, para que sepas que sigue la misma ruta de código. – mclin

+0

su problema se explica aquí http://developer.android.com/guide/topics/search/search-dialog.html#LifeCycle, sin embargo, incluso después de aplicar esto, todavía me sale nulo ... – max4ever

Cuestiones relacionadas