¿Son posibles varias clases SearchRecentSuggestionsProvider en la aplicación de Android?
Tengo dos actividades de búsqueda diferentes implementadas con SearchManager en mi aplicación. Una es la búsqueda predeterminada para la aplicación completa y la otra se utiliza para una sola actividad. Estas dos búsquedas realizan búsquedas de datos diferentes y no tiene sentido compartir el historial de búsqueda entre las dos búsquedas diferentes. Los dos searchables diferentes están funcionando bien funcionalmente dentro de la aplicación, mi problema es con los historiales de búsqueda recientes.
El problema es que hay dos clases diferentes de SearchRecentSuggestionsProvider definidas dentro de la aplicación, pero cualquier búsqueda realizada en una aparece en el historial de sugerencias de búsquedas recientes de ambas búsquedas. He leído el tema de SearchManager en la Guía de desarrollo pero no veo ninguna información sobre proveedores de sugerencias múltiples.
- Sugerencias de búsqueda personalizada en el widget de búsqueda
- La búsqueda crea nuevas actividades en TabActivity
- ¿Por qué es Intent.getAction () nulo de mi actividad de búsqueda?
- Barra de búsqueda o barra de progreso con varios colores
- Cómo realizar T9 Búsqueda de contactos por número en Android
Estos son los dos proveedores de AndroidManifest.xml, en el nodo:
<provider android:name=".SearchOneRecentSuggestionsProvider" android:authorities="com.company.SearchOneRecentSuggestionsProvider"></provider> <provider android:name=".SearchTwoRecentSuggestionsProvider" android:authorities="com.company.SearchTwoRecentSuggestionsProvider"></provider>
Aquí está la clase definida en SearchOneRecentSuggestionsProvider.java:
package com.company; import android.content.SearchRecentSuggestionsProvider; public class SearchOneRecentSuggestionsProvider extends SearchRecentSuggestionsProvider { public final static String AUTHORITY = "com.company.SearchOneRecentSuggestionsProvider"; public final static int MODE = DATABASE_MODE_QUERIES; public SearchOneRecentSuggestionsProvider() { setupSuggestions(AUTHORITY, MODE); } }
(La clase SearchTwoRecentSuggestionsProvider se ve exactamente igual excepto para reemplazar uno con dos y está en su propio archivo SearchTwoRecentSuggestionsProvider.java.)
Esto es lo que está dentro de la base de datos de sugerencias de búsqueda (en /data/data/com.company/databases/suggestions.db):
# sqlite3 suggestions.db SQLite version 3.5.9 Enter ".help" for instructions sqlite> .tables android_metadata suggestions sqlite> .schema suggestions CREATE TABLE suggestions (_id INTEGER PRIMARY KEY,display1 TEXT UNIQUE ON CONFLICT REPLACE,query TEXT,date LONG); sqlite> select * from suggestions; 1|searchone|searchone|1296177852444 2|searchtwo|searchtwo|1296177878744
No hay columna para el SearchRecentSuggestionsProvider, así que tal vez no hay manera de separar el historial de las dos búsquedas?
El resultado final de todo esto es que cuando haces una búsqueda en cualquiera de las dos búsquedas diferentes, ves tanto searchone como searchtwo en las sugerencias recientes del historial de búsqueda. Me gustaría que cada uno tuviera su propia historia si es posible. Espero que no me pierda algo tonto! Gracias por tomarse el tiempo para leer esto.
- SearchManager.getSearchableInfo (getComponentName ()) devuelve null
- Cómo buscar archivos en el teléfono sdcard o donde
- Implementación de búsqueda personalizada con SearchView
- Contactos de búsqueda inteligente en android
- ¿Cómo puedo añadir una vista de búsqueda a mi aplicación para Android?
- Evite que la actividad se recargue al hacer clic en SearchView
- ¿Cómo integrar la actividad de búsqueda con la búsqueda de voz de Google Ok?
- Diálogo de búsqueda en Mono Android
Miré el código fuente de SearchRecentSuggestionsProvider y SearchRecentSuggestions , y claramente estas clases fueron diseñadas para usar una base de datos común entre todas las aplicaciones, no con respecto a si usas múltiples proveedores o no (así que usar varios SearchRecentSuggestionsProvider en la misma aplicación es inútil). No puedo encontrar una forma de utilizar dos bases de datos diferentes.
Pero pensé en un truco: añadir un carácter (como '1' para las búsquedas recientes activity1 y '2' para las búsquedas recientes activity2) al principio de cada consulta al guardarlas con saveRecentQuery (). Si estás en activity1, harás saveRecentQuery ('1' + query, …).
A continuación, sustituir SearchRecentSuggestionsProvider.query (), aquí puede filtrar las filas que desea mostrar en función del valor del primer carácter, '1' o '2' (también debe quitarlo de la cadena, por supuesto). Si estás en activity1 quieres mantener sólo valores empezando por '1', …. De esta manera puede manejar varias listas de sugerencias.
Sin embargo, es un truco, y no estoy 100% seguro de que funcionará de esta manera …
Parece que no es posible en este momento. Para aquellos que busquen SO para este mismo problema, consulte https://code.google.com/p/android/issues/detail?id=13501 para futuras actualizaciones de Google.
He hecho una pequeña modificación a la clase que hace esto posible – ver https://gist.github.com/pokebyte/a08a67282a4f19ebbf52
Específicamente, el cambio agrega una nueva columna indexada ( authority
) que restringe las búsquedas a una autoridad específica.
- Html5 <audio>: cómo utilizar los controles `next` y` previous` integrados en iOS 4.2 / Android 2.3
- Botón de acción flotante de Android Semi Transparente Color de fondo