- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经成功地将我的应用程序的国家/地区搜索集成到全局搜索工具中,现在我正尝试在搜索建议旁边显示每个国家/地区的国旗。在我的应用程序中搜索以这种方式工作,但我当然可以控制列表及其 View 绑定(bind)自己。所以我知道标志都在那里,我可以在我的应用程序的其余部分中使用它们。
当我尝试向 Assets 中的 .gif 文件提供 Uri 时,问题就来了。根据搜索文档,具有键 SearchManager.SUGGEST_COLUMN_ICON_1
的列的值应该是图像的 Uri。
下面是代码的样子。响应 ContentProvider
方法 public Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
我正在创建一个 MatrixCursor
将我的国家/地区数据库中的列映射到搜索工具所需的列。国家名称显示正常,我可以选择它们并在我的应用程序中正确响应。
我试过用三种不同的方式形成 Uri:
// String flagUri = "file:///android_asset/" + flagPath;
// String flagUri = "file:///assets/" + flagPath;
String flagUri = "android.resource://com.lesliesoftware.worldinfo.WorldInfoActivity/assets/" + flagPath;
columnValues.add (flagUri);
它们都导致相同的结果 - 我可以通过使用空字符串值获得的每个建议旁边的应用程序图标。
是否有可用的 Uri?如何获得搜索建议旁边的国旗图标?
谢谢伊恩
完整来源:
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;
}
编辑:我尝试了其他变体,包括将图像从 Assets 移动到原始文件夹。没有任何效果。这是我试过的 uri:
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 是如果我将测试标志移动到我的可绘制文件夹中:
flagUriStr = "android.resource://com.lesliesoftware.worldinfo/" +
R.drawable.small_ca_flag;
最佳答案
遗憾的是,经过大量搜索后,我得出的结论是您无法将图像 Assets 的 uri 返回到搜索工具。我所做的是将我的标志图像移动到资源(这样它们就不会弄乱我的应用程序的资源我为标志图像创建了一个库)并使用资源 uri。因此,在我的提供程序中,我在将数据库结果映射到搜索结果的循环中有如下所示的代码:
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);
}
并查找如下所示的代码:
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;
...
我只需要确保我创建了一个测试来验证所有拥有国旗的国家/地区是否返回了预期的结果。
关于android - 如何获取我的 Assets 中适用于 SearchManager.SUGGEST_COLUMN_ICON_1 列的图像的 Uri?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4615509/
如何更改搜索管理器右侧的图标?默认图标是一个放大镜,但我见过一个应用程序显示“OK”而不是放大镜! 根据我的需要,放大镜图标不太好。我使用 SearchManager 来显示输入单词的历史记录。所以一
我已经在线阅读了所有关于构建搜索界面和添加自定义建议的文档……但我仍然不清楚这是如何工作的。该文档说我必须“为您的建议构建一个表(例如在 SQLiteDatabase 中)并使用所需的列格式化该表”。
我非常认真地研究了 sitecore 的搜索功能,直到现在我一直使用以前的开发人员使用的功能。我正在研究一个问题,其中某些谓词似乎没有在下面的代码中起作用: public IEnumerable Se
下面是获取searchmanagerinstance和调用trigger search的代码:同样适用于 startsearch 调用而不是 triggersearch String searchQu
我有一个带有 fragment 的 Activity 来列出一些数据。我已经使用 SearchView(操作栏上漂亮的搜索字段)实现了搜索。 搜索工作正常,用户输入数据,按下搜索按钮,结果按预期过滤。
我已经实现了一个带有最近搜索建议的搜索界面,如 documentation 中所述, 由于某种原因,历史图标来自错误的主题(深色而不是浅色。 我当前的任务是更改此图标。我相信我的主题是正确的,所以我试
我已经根据文档和其他问题检查并仔细检查了我的 list 。我不明白为什么 setSearchableInfo 返回 NullPointerException 主 Activity .java @Ove
我正在关注这个relatively simple tutorial关于如何手动启动 SearchableActivity 以便我可以从中获取 result。 他基本上是将base Activity(A
我关注了this Android guide为了向 Activity 添加搜索栏。设置如下所示: res/menu/activity_main.xml: res/xml/searchable
我已经成功地将我的应用程序的国家/地区搜索集成到全局搜索工具中,现在我正尝试在搜索建议旁边显示每个国家/地区的国旗。在我的应用程序中搜索以这种方式工作,但我当然可以控制列表及其 View 绑定(bin
我在任何地方都找不到如何通过 searchManager.getSearchableInfo() 使用支持的 v7 appcompat 库。 @Override public boolean onCr
用例: Activity A 是主要 Activity 。而 Activity B 是 SearcActivity (SearchManager)。 Activity B 是 ListActivity
我是一名开发 Android 应用程序的新手,以下是该应用程序的第一个屏幕。我希望我的应用程序使用该搜索对话框执行搜索。 为此,我关注了http://developer.android.com/gui
我是一名优秀的程序员,十分优秀!