我已经实现了一个搜索界面,其中包含最近的搜索建议,如documentation中所述,由于某种原因,历史图标来自错误的主题(黑暗而不是光。
我目前的任务是更改此图标。我相信我的主题是正确的所以我试图覆盖SearchRecentSuggestionsProvider
但没有任何成功。我从2个帖子中获取灵感(there和there)我尝试了以下内容:
覆盖query()
并指定其他投影
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Uri iconUri = Uri.parse("android.resource://" + getContext().getPackageName() + "/drawable/icon_search_history");
projection = new String[] {
"_id",
"display1 AS " + SearchManager.SUGGEST_COLUMN_TEXT_1,
"query AS " + SearchManager.SUGGEST_COLUMN_QUERY,
"'" + iconUri + "'" + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1
};
return super.query(uri, projection, selection, selectionArgs, sortOrder);
}
我也试过覆盖setupSuggestions()
@Override
protected void setupSuggestions(String authority, int mode) {
super.setupSuggestions(authority, mode);
Uri iconUri = Uri.parse("android.resource://" + RFDApplication.getApplicationPackageName() + "/drawable/icon_search_history");
Field f = null;
try {
f = getClass().getDeclaredField("mSuggestionProjection");
f.setAccessible(true);
String[] projection = new String [] {
"0 AS " + SearchManager.SUGGEST_COLUMN_FORMAT,
"'" + iconUri + "'" + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1,
"display1 AS " + SearchManager.SUGGEST_COLUMN_TEXT_1,
"query AS " + SearchManager.SUGGEST_COLUMN_QUERY,
"_id"};
f.set(this,projection);
} catch (Exception e) {
e.printStackTrace();
}
}
我从没想过我会有这么难的时间更换图标:)任何帮助或建议都会非常感激......
修改
我找到了一个半满意的解决方案:替换query()
中的整个光标。我仍然宁愿避免两次迭代结果(虽然我知道在这种情况下开销可能微不足道)。所以问题仍未解决
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// File to use
Cursor parent = super.query(uri, projection, selection, selectionArgs, sortOrder);
Uri iconUri = Uri.parse("android.resource://" + getContext().getPackageName() + "/drawable/icon_search_history");
MatrixCursor cursor = new MatrixCursor(parent.getColumnNames());
parent.moveToFirst();
while (parent.moveToNext()){
cursor.addRow(new Object[]{
parent.getInt(parent.getColumnIndex("suggest_format")),
iconUri,
parent.getString(parent.getColumnIndex("suggest_text_1")),
parent.getString(parent.getColumnIndex("suggest_intent_query")),
parent.getInt(parent.getColumnIndex("_id"))
});
}
return cursor;
}
答案 0 :(得分:4)
Cursor
;然后覆盖getString()
以返回自定义图标的uri。在setupSuggestions()
中,SearchRecentSuggestionsProvider
使用私有字段mSuggestionProjection
为最新图标uri定义别名SearchManager.SUGGEST_COLUMN_ICON_1
。对于查询提供程序时获得的所有最新内容,这将在Cursor
中返回。
现在,您不希望使用反射来改变私有字段值,因为它们是依赖于实现的,并且这可能在将来中断。您要做的是将每个来电从Cursor.getMyOldIconUri()
发送到Cursor.getMyNewIconUri()
,以便从外部看起来您有效地更改了图标。而且您不需要事先迭代结果。
使用CursorWrapper
:
String mIconUri; // a drawable ID as a String will also do!
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
class Wrapper extends CursorWrapper {
Wrapper(Cursor c) {
super(c);
}
public String getString(int columnIndex) {
if (columnIndex != -1
&& columnIndex == getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1))
return mIconUri;
return super.getString(columnIndex);
}
}
return new Wrapper(super.query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder);
}
答案 1 :(得分:0)
查看详细描述的this文档。
您必须更改此内容:cursor.addRow(new Object[]{
parent.getInt(parent.getColumnIndex("suggest_format")),
iconUri,
parent.getString(parent.getColumnIndex("suggest_text_1")),
parent.getString(parent.getColumnIndex("suggest_intent_query")),
parent.getInt(parent.getColumnIndex("_id"))
});
至:cursor.addRow(new Object[]{
parent.getString(parent.getColumnIndex("suggest_text_1")),
iconUri,
parent.getString(parent.getColumnIndex("suggest_intent_query"))
});
并改变这个:
projection = new String[] {
"_id",
"display1 AS " + SearchManager.SUGGEST_COLUMN_TEXT_1,
"query AS " + SearchManager.SUGGEST_COLUMN_QUERY,
"'" + iconUri + "'" + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1
};
到此:
projection = {
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_ICON_1,
SearchManager.SUGGEST_COLUMN_QUERY};