如何更改最近的搜索图标(SearchManager.SUGGEST_COLUMN_ICON_1列)

时间:2014-05-16 14:10:21

标签: android android-contentprovider

我已经实现了一个搜索界面,其中包含最近的搜索建议,如documentation中所述,由于某种原因,历史图标来自错误的主题(黑暗而不是光。

enter image description here

我目前的任务是更改此图标。我相信我的主题是正确的所以我试图覆盖SearchRecentSuggestionsProvider但没有任何成功。我从2个帖子中获取灵感(therethere)我尝试了以下内容:

覆盖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;
}

2 个答案:

答案 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};