He integrado con éxito la búsqueda de país de mi aplicación en la función de búsqueda global y ahora estoy tratando de mostrar el indicador de cada país al lado de las sugerencias de búsqueda. La búsqueda dentro de mi aplicación funciona de esta manera, pero, por supuesto, tengo el control de la lista y su visión vinculante. Entonces sé que las banderas están todas allí y puedo usarlas en el resto de mi aplicación.¿Cómo obtengo un URI en una imagen en Mis activos que funcionará para la columna SearchManager.SUGGEST_COLUMN_ICON_1?
El problema surge cuando trato de suministrar un Uri a un archivo .gif en mis activos. De acuerdo con la documentación de búsqueda, el valor de la columna con la clave SearchManager.SUGGEST_COLUMN_ICON_1
debe ser un Uri para la imagen.
A continuación se muestra el código. En respuesta al método ContentProvider
public Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
, estoy creando un MatrixCursor
que mapea columnas de la base de datos de mi país a aquellas requeridas por el servicio de búsqueda. Los nombres de países aparecen bien y puedo seleccionarlos y responder correctamente en mi aplicación.
He intentado formar el URI de tres maneras diferentes:
// String flagUri = "file:///android_asset/" + flagPath;
// String flagUri = "file:///assets/" + flagPath;
String flagUri = "android.resource://com.lesliesoftware.worldinfo.WorldInfoActivity/assets/" + flagPath;
columnValues.add (flagUri);
todos ellos conducen a la misma cosa - mi icono de la aplicación junto a cada sugerencia que puedo recibir al usar un valor de cadena vacía.
¿Hay un Uri que funcione? ¿Cómo puedo obtener el icono de la bandera del país al lado de las sugerencias de búsqueda?
Gracias Ian
La fuente completo:
private Cursor search (String query, int limit) {
query = query.toLowerCase();
String[] requestedColumns = new String[] {
BaseColumns._ID,
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_ICON_1,
};
String[] queryColumns = new String[] {
WorldInfoDatabaseAdapter.KEY_ROWID,
WorldInfoDatabaseAdapter.KEY_COUNTRYNAME,
WorldInfoDatabaseAdapter.KEY_COUNTRYCODE
};
return packageResults (query, requestedColumns, queryColumns, limit);
}
private Cursor packageResults (String query, String[] requestedColumns, String[] queryMappedColumns, int limit) {
if (requestedColumns.length != queryMappedColumns.length)
throw new IllegalArgumentException ("Internal error: requested columns do not map to query columns");
MatrixCursor results = new MatrixCursor (requestedColumns);
// Query the country list returns columns: KEY_ROWID, KEY_COUNTRYNAME, KEY_COUNTRYCODE
Cursor dbResults = myDbHelper.getCountryList (query);
// Verify that the query columns are available
for (int index = 0; index < queryMappedColumns.length; index++) {
int col = dbResults.getColumnIndex (queryMappedColumns[index]);
if (col == -1)
throw new IllegalArgumentException ("Internal error: requested column '" +
queryMappedColumns[index] + "' was not returned from the database.");
}
// Loop over the database results building up the requested results
int rowCount = 0;
while (dbResults.moveToNext() && rowCount < limit) {
Vector<String> columnValues = new Vector<String>();
for (int index = 0; index < requestedColumns.length; index++) {
if (requestedColumns[index].compareTo (SearchManager.SUGGEST_COLUMN_ICON_1) == 0) {
String flagPath = "flags/small/" + dbResults.getString (
dbResults.getColumnIndexOrThrow (queryMappedColumns[index]))
+ "-flag.gif";
// String flagUri = "file:///android_asset/" + flagPath;
// String flagUri = "file:///assets/" + flagPath;
String flagUri = "android.resource://com.lesliesoftware.worldinfo.WorldInfoActivity/assets/" + flagPath;
columnValues.add (flagUri);
} else {
// Add the mapped query column values from the database
String colValue = dbResults.getString (dbResults.getColumnIndexOrThrow (queryMappedColumns[index]));
columnValues.add (colValue);
}
}
results.addRow (columnValues);
rowCount++;
}
return results;
}
EDIT: He probado otras variaciones, incluyendo mover las imágenes de los activos a la carpeta prima. Nada funcionó. Estos son los de Uri que probé:
flagUriStr = "android.resource://com.lesliesoftware.worldinfo/raw/flags/small/" +
countryCode + "-flag.gif";
flagUriStr = "android.resource://com.lesliesoftware.worldinfo/assets/flags/small/" +
countryCode + "-flag.gif";
flagUriStr = "android.resource://com.lesliesoftware.worldinfo/assets/flags/small/" +
countryCode + "-flag";
flagUriStr = "android.resource://com.lesliesoftware.worldinfo/raw/" +
countryCode + "-flag.gif";
flagUriStr = "android.resource://com.lesliesoftware.worldinfo/raw/" +
countryCode + "-flag";
El único URI que hizo el trabajo era si me movía una bandera de prueba en mi carpeta de dibujable:
flagUriStr = "android.resource://com.lesliesoftware.worldinfo/" +
R.drawable.small_ca_flag;
En realidad, se puede hacer. Ver a continuación la respuesta. :-) – vidstige