2014-05-16 2 views
2

documentation에 설명 된대로 최근 검색어 제안으로 검색 인터페이스를 구현했습니다. 그리고 어떤 이유로 인해 역사 아이콘이 잘못된 테마 (빛이 아닌 어둠)에서 나옵니다.최근 검색 아이콘 (SearchManager.SUGGEST_COLUMN_ICON_1 열) 변경 방법

enter image description here

내 현재 작업이 아이콘을 변경하는 것입니다. 나는 내 테마 그래서 나는 SearchRecentSuggestionsProvider을 무시하려고하지만 어떤 성공을없이하고 올바른 생각합니다. 나는이 개 글 (therethere) 내가 가지고에서 영감을했다 다음과 같은 작업을 시도했습니다.

(210)

재정 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(); 
    } 
} 

나는 그런 힘든 시간 아이콘 : 어떤 도움이나 제안하고자 변화를 상상하지 많이 감사하겠습니다 ...

EDIT 나는 완전히 만족스러운 해결책을 찾았습니다. n 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; 
} 

답변

4
  • 랩 결과와 Cursor; getString()을 재정 의하여 사용자 정의 아이콘의 URI를 반환하십시오.

setupSuggestions()에서 SearchRecentSuggestionsProvider는 최근 사용 아이콘 URI에 대한 별칭 SearchManager.SUGGEST_COLUMN_ICON_1을 정의하기 위해 민간 분야 mSuggestionProjection를 사용합니다. 이것은 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); 
} 
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};