Передайте параметр пользовательскому предложению поиска ContentProvider
У меня есть рабочий класс пользовательских поисковых запросов (через http://developer.android.com/guide/topics/search/adding-custom-suggestions.html). В настоящее время он возвращает один тип информации - "названия продуктов".
Я добавил некоторые дополнительные действия (экраны) в свое приложение, чтобы, если человек находится на странице продукта, при запуске поиска возвращались результаты из "названий продуктов", но если они находятся в другом действии, мне нужен поиск предложения вытащить "имена производителей".
Я видел Доступ к пакету appSearchData из ContentProvider, но пользовательский поставщик предложений поиска расширяет ContentProvider, который не работает с ответом
Bundle b = intent.getBundleExtra(SearchManager.APP_DATA);
Этот пакет доступен для класса результатов поиска, но не для поставщика контента.
Как лучше всего передать параметр ("продукт" или "производитель") поставщику контента для предложений поиска?
2 ответа
Это не кажется идеальным решением, но у меня была такая же потребность, и я обнаружил, что могу выполнить свою работу, добавив общедоступный ivar или метод в подкласс ContentProvider, который обрабатывает предложения поиска. Перед началом поиска вы можете настроить своего провайдера по мере необходимости. Вы можете получить доступ к экземпляру провайдера следующим образом:
ContentProviderClient client = getContentResolver().acquireContentProviderClient("my.searchsuggestionprovider");
MyProviderClass provider = (MyProviderClass) client.getLocalContentProvider();
Теперь вы можете настроить с provider.setParameter("product")
или что вам нужно. Возможно, вам придется сбросить параметр на значение по умолчанию или что-то еще после построения вашего курсора.
Редактировать: это оказалось непрактичным, по крайней мере, в моем случае, так как поставщик контента вызывается с помощью query() каждый раз, когда вводится символ. Вместо этого я использовал обходной путь, аналогичный тому, который описан в set-search-hint-dynamic. Создавая альтернативные "доступные для поиска" определения и действия XML, вы можете изменить URI, который передается поставщику контента в query(), добавив компонент пути, чтобы предоставить дополнительный параметр или контекст, который вам нужен.
Я только что сделал статическую переменную для параметра в моем поставщике контента и установил его из действия. Я думал об этом, и это самый чистый обходной путь, который я нашел!