Как передать дополнительные переменные во время поиска, вызванного SearchView/Widget?
Я успешно использую виджет поиска в своей панели действий, чтобы выполнить поиск, следующий этому руководству. Поиск в порядке, но мне интересно, как передать дополнительные переменные в поиске. В тех же руководящих состояниях я могу переопределить onSearchRequested()
, но это не похоже на работу с виджетами поиска.
-
Переопределение в вопросе:
@Override
public boolean onSearchRequested() {
Bundle appData = new Bundle();
appData.putString("KEY", "VALUE");
startSearch(null, false, appData, false);
return true;
}
-
Получение пакета в моем классе активности:
protected void onCreate(Bundle savedInstanceState) {
// ...
Intent intent = getIntent();
Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA);
String value = appData.getString("KEY");
Log.d("VALUE", value);
// ...
}
Мое приложение падает при создании класса поиска, потому что appData
всегда null
.
Примечание
onSearchRequested()
-, но пакет не подходит для моего метода onCreate()
.
Все дополнительные данные из пройденного намерения {user_query=my-query, query=my-query}
.
Ответы
Ответ 1
Кажется, единственный способ сделать это - перехватить новые действия, созданные в вашей деятельности, которая включена с помощью поиска. Для этого мы переопределяем метод startActivity()
. Затем мы можем проверить, чтобы активность была действительно активностью поиска, а затем добавьте дополнительную возможность. Рабочий код ниже.
@Override
public void startActivity(Intent intent) {
// check if search intent
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
intent.putExtra("KEY", "VALUE");
}
super.startActivity(intent);
}
Затем вы можете захватить дополнительные, как и любые другие дополнительные операции поиска, используя:
mValue = intent.getStringExtra("KEY");
Ответ 2
Вы можете переопределить метод onSearchRequested
внутри Activity
, который вызывает поиск.
@Override
public boolean onSearchRequested() {
Bundle appData = new Bundle();
appData.putBoolean(SearchableActivity.JARGON, true);
startSearch(null, false, appData, false);
return true;
}
то вы можете извлечь эти данные внутри SearchableActivity
Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);
if (appData != null) {
boolean jargon = appData.getBoolean(SearchableActivity.JARGON);
}
Ответ 3
Я думаю, вы хотите просто использовать
String value = intent.getStringExtra(SearchManager.APP_DATA);
потому что намерение содержит пакет, который вы передали, чтобы начать поиск.