onSearchRequested() ya no funciona en Android 4.x+?
android-4.0 (2)
Sí, Google secuestró el botón de búsqueda cuando introdujo Jelly Bean (Android 4.1) y si intentas interceptarlo antes, en onKeyDown() :
...
else if (keyCode == KeyEvent.KEYCODE_SEARCH) {
return this.onSearchRequested();
}
Te darás cuenta que tampoco funcionará.
Pero tal vez esta solución podría ayudarle?
Mi aplicación intercepta el botón de búsqueda para entregar algo más relevante para la aplicación en sí:
@Override
public boolean onSearchRequested() {
if (isOkToSearchWithinTheApp())
doRelevantOwnSearch();
return true;
}
Funcionó (aún funciona) muy bien en todas las versiones de Android, excepto en mi nuevo teléfono 4.1.2: En este teléfono Android 4.x, se invoca algo llamado "Google Now".
¿Es esto un bien conocido (es decir, cambio documentado)?
Si es así, ¿hay alguna otra manera de "interceptar" el botón de búsqueda?
Actualización: hice exactamente lo que se sugiere en @ daniel_c05 a continuación, pero al tocar el botón de búsqueda se sigue produciendo el mismo comportamiento: traer la actividad de búsqueda de Google (y suspender mi propia actividad, que claramente no es el comportamiento deseado):
Por cierto, la respuesta aceptada en esta pregunta similar no es aceptable ... entonces, ¿hay alguna otra forma de "interceptar" el botón de búsqueda?
Tengo un Galaxy Nexus con 4.2.1 y no tengo problemas al utilizar oonSearchRequested
Algunas cosas a considerar:
1 - Asegúrese de declarar en su manifiesto que la actividad de búsqueda ES de hecho se puede buscar, y asegúrese de agregar el Filtro de Intención de Búsqueda para capturar onSearchRequested:
<activity
android:name="com.lazybits.rae.movil.Results"
android:label="@string/title_activity_results"
android:launchMode="singleTask"
android:parentActivityName="com.lazybits.rae.movil.Home" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
2 - Anular onKeyDown()
para crear una interfaz de búsqueda adecuada:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_SEARCH) && isOkToSearchWithinTheApp) {
onSearchRequested();
return true;
}
return super.onKeyDown(keyCode, event);
}
En este punto, si tiene un searchwidget, debería cargarse automáticamente, y ahora está esperando la entrada del usuario. Desea anular onNewIntent
para gestionar la búsqueda a través de Action.Search o Action.View según su comportamiento de searchable.xml.
EDITAR
Bien, ¿puedes hacerme un favor y simplemente tratar de anular onKeyDown, pero no poner ningún código en él, como esto?
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_SEARCH) {
//do nothing, simply return true to avoid regular behavious
return true;
}
}
Lo que quiero probar es ver si eso evitará que Google aparezca ahora, esto no debería hacer absolutamente nada. Si eso funciona, luego puede agregar su código, solo asegúrese de devolver el valor verdadero (para evitar una mayor propagación del evento) y de que no llame onSearchRequested.