Uso de una URL web para SUGGEST_COLUMN_ICON_1 para sugerencias de búsqueda
Tengo una configuración de SearchManager
donde un desplegable de sugerencias se mostrará como los tipos de usuario. Los resultados son de mi servidor (http). Me gustaría mostrar un icono con cada opción (si el archivo de hecho existe).
Mirando los documentos, veo las opciones para la columna constante SUGGEST_COLUMN_ICON_1
permite estas opciones:
- Análisis de la cadena JSON de la URL (RESTful webservice) mediante las bibliotecas GSON. Androide
- ANDROID: ¿Cómo puedo descargar un archivo de vídeo a una tarjeta SD?
- Cómo enviar una cadena que contiene% símbolo a webservice usando HttpPost en android?
- Cómo almacenar datos desde un archivo XML a una base de datos SQLite en android
- Cómo cargar URL consecutivamente una por una
Column name for suggestions cursor. Optional. If your cursor includes this column, then all suggestions will be provided in a format that includes space for two small icons, one at the left and one at the right of each suggestion. The data in the column must be a resource ID of a drawable, or a URI in one of the following formats: content (SCHEME_CONTENT) android.resource (SCHEME_ANDROID_RESOURCE) file (SCHEME_FILE)
Todo lo que tengo es una URL. ¿Qué opción funcionaría mejor para mí?
Aquí está la class
en la que estoy haciendo esto:
public class MyCustomSuggestionProvider extends SearchRecentSuggestionsProvider { public static final String AUTHORITY = "---.MyCustomSuggestionProvider"; public static final int MODE = DATABASE_MODE_QUERIES; private final static String[] COLUMN_NAMES = {BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1, SearchManager.SUGGEST_COLUMN_TEXT_2, SearchManager.SUGGEST_COLUMN_QUERY, SearchManager.SUGGEST_COLUMN_INTENT_DATA, SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA, SearchManager.SUGGEST_COLUMN_ICON_1, SearchManager.SUGGEST_COLUMN_INTENT_ACTION}; public MyCustomSuggestionProvider() { setupSuggestions(AUTHORITY, MODE); } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Cursor recentCursor = super.query(uri, projection, selection, selectionArgs, sortOrder); String query = selectionArgs[0]; if (query == null || query.length() < 3) { return recentCursor; } final MatrixCursor customCursor = new MatrixCursor(COLUMN_NAMES); // Get web results from Retrofit Library List<TheProfile> suggestions = RestClient.get().getCustomSearch(query, MyApp.getUserId()); for (TheProfile suggestion : suggestions) { Uri searchIconUri = Uri.parse("http:/---/profile_images/" + String.valueOf(suggestion.id) + ".png"); try { customCursor.addRow(new Object[]{ suggestion.id, suggestion.profile, suggestion.subcategory, suggestion.profile, suggestion.profile, suggestion.subcategory, searchIconUri, "android.intent.action.SEARCH"}); } catch (Exception e) { e.printStackTrace(); } } return customCursor; } }
- ¿Detectar si url especificada es una imagen en Android?
- Imagen de visualización de la aplicación de Android desde la URL
- ¿Qué es un filtro de intenciones que solo mostraría una aplicación en el menú compartido al compartir una URL?
- Cargar archivo local y obtener Error cromo desconocido: -6
- ¿Cómo puedo analizar xml de url en android?
- ¿Hay una manera más rápida de descargar una página de la red a una cadena?
- Al hacer clic en URL, se abre el navegador predeterminado
- Cómo obtener la URL actual en un navegador de Android
Para aquellos, que sigue buscando la respuesta para esta pregunta, como lo hice. Es bastante similar a mi código, así que decidí compartirlo. Pasé horas juntando todo esto. Tal vez, ahorraré tiempo para alguien. En primer lugar, necesitará la biblioteca Glide .
Añadirlo al archivo build.gradle de su aplicación:
repositories { mavenCentral() // jcenter() works as well because it pulls from Maven Central } dependencies { compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.android.support:support-v4:19.1.0' }
Ahora vamos a hacer algunos cambios en el código de la pregunta (en la clase MyCustomSuggestionProvider
): Póngalo dentro de su for (TheProfile suggestion : suggestions) {
FutureTarget<File> futureTarget = Glide .with(getContext().getApplicationContext()) .load(searchIcon) .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL); File cacheFile = futureTarget.get(); Uri searchIconUri = Uri.fromFile(cacheFile);
Preste atención a esta línea de código: .with(getContext().getApplicationContext())
Eso es muy importante para obtener Contexto de la Aplicación, no sólo Contexto, ya que no vamos a mostrar bmp en ImageView. Documentación oficial de Glide para este tipo de uso de Glide.
Y después de todo puede llamar:
// do things with bitmap and then release when finished: Glide.clear(futureTarget);
-
Recoge todos los archivos que vas a usar como iconos. Probablemente están en su servidor; Necesita integrarlos en su aplicación.
-
Si no están en el formato .PNG, convertirlos al formato .PNG. Escala al tamaño que necesitas para mostrar en tu aplicación.
-
Añádalos a su proyecto de Android en la carpeta / res / drawable-mdpi. Ponerlos en la carpeta específica de mdpi los escalará en el mismo tamaño en diferentes resoluciones de dispositivo.
-
La primera parte del código para los iconos es tener URIs para devolver para
SearchManager
. Utilice el esquema "android.resource" en el formato:android.resource://<package-name>/<resource-type>/<resource-name>
Por ejemplo, puede crear un
final URI
para cada icono. He aquí un ejemplo de un URI que usé en mi proyecto para/res/drawable-mdpi/ic_autocomplete_1.png
:private final Uri searchIconUri = Uri.parse("android.resource://com.mycompany.android/drawable/ic_autocomplete_1");
-
A medida que realiza un bucle a través de sus sugerencias, determine qué icono es necesario, por ejemplo, con una instrucción
switch
, y coloque ese URI en el objeto de fila, tal y como aparece en su código.
- Mantenimiento de un PhoneGap Hybrid / Web App Codebase
- ¿Cómo puedo agregar datos que he introducido en un cuadro de EditText en una matriz para enumerar en otra actividad?