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


person danada    schedule 30.01.2013    source источник


Ответы (3)


Кажется, единственный способ сделать это - перехватить новые действия, созданные в вашей деятельности, которая поддерживает поиск. Для этого мы переопределяем метод 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");
person danada    schedule 03.02.2013
comment
Спасибо. Это прекрасно работает. Кстати, эта проблема существует только в API 11 (я тестировал на эмуляторы). - person ; 28.03.2013
comment
просто используйте его в своем классе активности. фрагмент имеет функцию startActivity, но в этой ситуации она не работает. - person okarakose; 24.08.2016
comment
Этот ответ неверен!! Это вообще не работает. См. ответ PenduDevs. И см. developer.android.com/guide/topics/search/search- dialog.html Раздел: Передача данных контекста поиска - person Ton Snoei; 16.11.2017
comment
@Ton Snoei, если ты не можешь заставить это работать, это твоя проблема. это работает для меня. Но да, правда, что это можно сделать и другими способами! - person Andris; 13.02.2019

Вы можете переопределить метод 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);
}
person penduDev    schedule 08.02.2016

Я думаю, вы хотите просто использовать

String value = intent.getStringExtra(SearchManager.APP_DATA);

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

person harmanjd    schedule 30.01.2013
comment
Спасибо за ответ! К сожалению, это не работает. Ключ SearchManager.APP_DATA должен использоваться при отправке bundle, а не string. - person danada; 30.01.2013
comment
О, я вижу. Вы просмотрели дополнительные сведения о намерении (intent.getExtras) с помощью отладчика, чтобы увидеть, установлено ли там что-нибудь? У меня сложилось впечатление, что все, что вы поместите в пакет в вызове startSearch, будет доступно в качестве дополнений к намерению в поисковой активности. - person harmanjd; 30.01.2013
comment
документация действительно указывает на то, что ваш подход должен работать. Я не вижу никаких признаков того, что это изменилось в разных версиях API, но я бы все же посоветовал на всякий случай проверить дополнительные сведения о намерениях. - person harmanjd; 30.01.2013
comment
Единственные данные, которые я смог извлечь из намерения, — это действие android.intent.action.SEARCH и запрос {user_query=my query, query=my query}. - person danada; 30.01.2013
comment
Я нашел кого-то еще, кто сказал, что пакет не будет отправлен здесь, но без объяснений. Предлагаемая там альтернатива не позволяет мне добавлять дополнительные переменные. - person danada; 30.01.2013
comment
Ага, я понял. Скоро опубликую ответ q: - person danada; 02.02.2013