问题描述
我已成功将应用的国家/地区搜索集成到全球搜索工具中,现在我正尝试在搜索建议旁边显示每个国家/地区的国旗.在我的应用程序中搜索以这种方式工作,但当然我可以自己控制列表及其视图绑定.所以我知道所有标志都在那里,我可以在我的应用程序的其余部分使用它们.
I have successfully integrated my app's country search into the global search facility and now I am trying to display each country's flag next to the search suggestions. Search inside my app works this way but of course I have control of the list and its view binding myself. So I know the flags are all there and I can use them in the rest of my app.
当我尝试为资产中的 .gif 文件提供 Uri 时,问题就出现了.根据搜索文档,键为 SearchManager.SUGGEST_COLUMN_ICON_1
的列的值应该是图像的 Uri.
The trouble comes when I try to supply a Uri to a .gif file in my Assets. According to the search documentation the value of the column with the key SearchManager.SUGGEST_COLUMN_ICON_1
should be a Uri to the image.
下面是代码的样子.响应 ContentProvider
方法 public Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
我正在创建一个 MatrixCursor
将我所在国家/地区数据库中的列映射到搜索工具所需的列.国家/地区名称显示正常,我可以选择它们并在我的应用程序中正确响应.
Below is what the code looks like. In response to the ContentProvider
method public Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
I am creating a MatrixCursor
that maps columns from my country database to those required by the search facility. The country names show up fine and I can select them and correctly respond in my application.
我尝试通过三种不同的方式形成 Uri:
I have tried forming the Uri three different ways:
// String flagUri = "file:///android_asset/" + flagPath;
// String flagUri = "file:///assets/" + flagPath;
String flagUri = "android.resource://com.lesliesoftware.worldinfo.WorldInfoActivity/assets/" + flagPath;
columnValues.add (flagUri);
它们都导致了同样的事情——我可以通过使用空字符串值来获得每个建议旁边的应用程序图标.
They all lead to the same thing - my application icon next to each suggestion which I can get by using a value of empty string.
有一个可以工作的 Uri 吗?如何在搜索建议旁边获得国旗图标?
Is there a Uri that will work? How can I get the country flag icon next to the search suggestions?
谢谢伊恩
完整来源:
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;
}
我尝试了其他变体,包括将图像从资产移动到原始文件夹.没有任何效果.这是我尝试过的 uri:
I have tried other variations including moving the images from the assets to the raw folder. Nothing worked. Here are the uri's I tried:
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";
唯一有效的 uri 是我是否将测试标志移动到我的可绘制文件夹中:
The only uri that did work was if I moved a test flag into my drawable folder:
flagUriStr = "android.resource://com.lesliesoftware.worldinfo/" +
R.drawable.small_ca_flag;
推荐答案
遗憾的是,经过大量搜索后,我得出的结论是,您无法将图像资产的 uri 返回到搜索工具.我所做的是将我的标志图像移动到资源中(这样它们就不会弄乱我为标志图像创建的库的应用程序资源)并使用资源 uri.因此,在我的提供程序中,我在将数据库结果映射到搜索结果的循环中具有如下所示的代码:
Sadly after much searching around I have reached the conclusion that you cannot return a uri to an image asset to the search facility. What I did instead was move my flag images to the resources (so they do not clutter up my app's resources I created a library for the flag images) and use resource uri's. So, in my provider I have code that looks like this in the loop that maps database results to search results:
if (requestedColumns[index].compareTo (SearchManager.SUGGEST_COLUMN_ICON_1) == 0) {
// Translate the country code into a flag icon uri
String countryCode = dbResults.getString (
dbResults.getColumnIndexOrThrow (queryMappedColumns[index]));
int flagImageID = FlagLookup.smallFlagResourceID (countryCode);
String flagUriStr = "android.resource://com.lesliesoftware.worldinfo/" + flagImageID;
columnValues.add (flagUriStr);
}
并查找如下所示的代码:
and look up code that looks like this:
static public int smallFlagResourceID (String countryCode) {
if (countryCode == null || countryCode.length () == 0)
return R.drawable.flag_small_none;
if (countryCode.equalsIgnoreCase ("aa"))
return R.drawable.flag_small_aa;
else if (countryCode.equalsIgnoreCase ("ac"))
return R.drawable.flag_small_ac;
else if (countryCode.equalsIgnoreCase ("ae"))
return R.drawable.flag_small_ae;
...
我只需要确保我创建了一个测试来验证所有有旗帜的国家/地区都返回了预期的结果.
I will just have to make sure I create a test that verifies that all countries that have flags returns the expected results.
这篇关于如何在我的资产中获取适用于 SearchManager.SUGGEST_COLUMN_ICON_1 列的图像的 Uri?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,WP2