Подтвердить что ты не робот

Android SearchRecentSuggestions - предложения не отображаются при вводе в SearchView

У меня есть рабочий виджет поиска и вы хотите добавить предложения истории поиска. Я следил за учебником Android (http://developer.android.com/guide/topics/search/adding-recent-query-suggestions.html), и пока поиск все еще работает, никаких предложений не отображается. Вот мой код:

  • Поставщик контента

    package com.mypackage;
    
    import android.content.SearchRecentSuggestionsProvider;
    
    public class SearchHistoryProvider extends SearchRecentSuggestionsProvider {
        public final static String AUTHORITY = SearchHistoryProvider.class.getName();
        public final static int MODE = DATABASE_MODE_QUERIES;
    
        public SearchHistoryProvider() {
            setupSuggestions(AUTHORITY, MODE);
        }
    }
    
  • Объявление поставщика в манифесте

    <provider 
        android:name=".SearchHistoryProvider"
        android:authorities="com.mypackage.SearchHistoryProvider">
    </provider>
    
  • Доступная для поиска конфигурация

    <?xml version="1.0" encoding="utf-8"?>
    <searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_name"
        android:hint="@string/search_hint"
        android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"
        android:searchSuggestAuthority="com.mypackage.SearchHistoryProvider"
        android:searchSuggestSelection=" ?">
    </searchable>
    
  • Сохранение запросов поставщику содержимого (в моей операции, доступной для поиска)

    private void handleIntent(Intent intent) {
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
    
        String query = intent.getStringExtra(SearchManager.QUERY);
        SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
                            SearchHistoryProvider.AUTHORITY, SearchHistoryProvider.MODE);
        suggestions.saveRecentQuery(query, null);
    
        // Collapse the search view as a search is performed
        MenuItem searchItem = mMenu.findItem(R.id.search);
        SearchView searchView = (SearchView) mMenu.findItem(R.id.search).getActionView();
        searchItem.collapseActionView();
        searchView.setQuery("", false);
    
        // send the query to the global search activity for loading the data
        Intent globalSearchIntent = new Intent(this, GlobalSearchFragmentActivity.class);
        GroceryOTGUtils.copyIntentData(intent, globalSearchIntent);
        globalSearchIntent.putExtra(GlobalSearchFragmentActivity.GLOBAL_SEARCH, true);
        startActivity(globalSearchIntent);
    }
    }
    

Все работает отлично, за исключением того, что предложения фактически не отображаются (поиск выглядит так же, как и до того, как я их добавил). Любая помощь будет принята с благодарностью!

4b9b3361

Ответ 1

Я думаю, что проблема заключалась в том, что объявление SearchHistoryProvider в Manifest.xml было неправильно.

android:name=".SearchHistoryProvider"

Написание. $NAME - сокращение для $ DEFAULTPACKAGE. $NAME, поэтому, если ваш $DEFAULTPACKAGE является "com.myapp" и вы пишите .SearchHistoryProvider как android: имя вашего Провайдер, Android просто не найдет его, так как он находится в com.mypackage, как показывает первая строка следующего кода.

package com.mypackage;

import android.content.SearchRecentSuggestionsProvider;

public class SearchHistoryProvider extends SearchRecentSuggestionsProvider {
    public final static String AUTHORITY = SearchHistoryProvider.class.getName();
    public final static int MODE = DATABASE_MODE_QUERIES;

    public SearchHistoryProvider() {
        setupSuggestions(AUTHORITY, MODE);
    }
}