Как передать дополнительные переменные во время поиска, вызванного 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);

потому что намерение содержит пакет, который вы передали, чтобы начать поиск.