Проблема передачи пакета с onSearchRequested - PullRequest
2 голосов
/ 16 июня 2011

Я на самом деле пытаюсь использовать встроенный поисковый интерфейс Android, но у меня возникают некоторые проблемы при попытке передать данные с помощью поискового запроса.

Вот краткое объяснение: у меня есть объект в первом действии (FirstActivity) под названием «Категория», который реализует Serializable (я уже успешно передал его между действиями), и я хочу выполнить поиск, связанный с этой категорией, и отобразить результаты во втором действии (SecondActivity).

Итак, в FirstActivity я переопределяю метод onSearchRequest:

@Override
public boolean onSearchRequested() {
    Bundle appData = new Bundle();
    appData.putSerializable("category", _currentCategory);
    Log.d(Utils.LOG_TAG, "Bundle : "+appData.keySet());
    startSearch(null, false, appData, false);
    return true;
}

А в SecondActivity я пытаюсь получить этот комплект:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    handleIntent(getIntent());
}

private void handleIntent(Intent intent){
    Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA);
    if(appData == null) Log.d(Utils.LOG_TAG, "appData == null");
    Log.d(Utils.LOG_TAG, "Extras : "+intent.getExtras().keySet());
}

Проблема в том, что appData кажется равным нулю каждый раз. Вот вывод logcat:

Bundle : [category]
appData == null
Extras : [query, user_query]

Я пытался добавить некоторые другие объекты в Bundle (Booleans и т. Д.), Но это ничего не изменило, и у меня все еще есть нулевые данные appData.

Ответы [ 4 ]

3 голосов
/ 14 сентября 2013

У меня тоже были проблемы с выяснением этого, и примеры, которые я нашел, не очень помогли.Многие из них предложили переопределить onSearchRequested (), но на самом деле это не работает для SearchWidget.В итоге я использовал следующее (из Данады) в качестве решения, поскольку для меня это казалось намного проще, чем настройка OnQueryTextListener.Я просто переопределил startActivity (во-первых, Search Activity) следующим образом:

@Override
public void startActivity(Intent intent) {      
    //check if search intent
    if(Intent.ACTION_SEARCH.equals(intent.getAction())) {
        intent.putExtra("KEY", "VALUE");
    }

    super.startActivity(intent);
}

Затем во втором, доступном для поиска Activity я вытащил информацию примерно так (вызывается из onCreate () или overriding onNewIntent () (при использовании singleTop)):

private void handleIntent(Intent intent){
    if(Intent.ACTION_SEARCH.equals(intent.getAction())){
    mSearchedQuery = intent.getStringExtra(SearchManager.QUERY);
    mExtraData = intent.getStringExtra("KEY");
}

Просто и работает как шарм!Проверьте ссылку на статью выше, если вы хотите немного больше объяснений по этому поводу.

1 голос
/ 29 ноября 2012

Если вы используете SearchView , он не отправит ваш appData. Вместо этого рассмотрите возможность использования OnQueryTextListener . Например:

...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.your-menu-id, menu);

    /*
     * Get the SearchView and set the searchable configuration.
     */
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.your-search-menuitem-id)
            .getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    /*
     * Set query text listener here.
     */
    searchView.setOnQueryTextListener(mSearchViewOnQueryTextListener);

    return true;
}// onCreateOptionsMenu()

...
private final SearchView.OnQueryTextListener mSearchViewOnQueryTextListener = new SearchView.OnQueryTextListener() {

    @Override
    public boolean onQueryTextSubmit(String query) {
        /*
         * You don't need to deal with "appData", because you already
         * have the search query here.
         */

        // Tell the SearchView that we handled the query.
        return true;
    }// onQueryTextSubmit()

    @Override
    public boolean onQueryTextChange(String newText) {
        // TODO Auto-generated method stub
        return false;
    }// onQueryTextChange()
};// mSearchViewOnQueryTextListener

Примечание: Вам все еще нужно придерживаться старого способа (используя appData внутри onSearchRequested()). В вашем onCreate(), если дополнительное значение для SearchManager.APP_DATA равно null, это означает, что вы уже обработали поисковый запрос в слушателе.

Вывод:

  • Если SearchView неактивен и вы вызываете его через onSearchRequested(), это произойдет: onSearchRequested() >> onCreate() (ACTION_SEARCH содержит SearchManager.APP_DATA).
  • Если SearchView активен, пользователь вводит и отправляет запрос на поиск, это произойдет: SearchView.OnQueryTextListener.onQueryTextSubmit() >> onCreate() (ACTION_SEARCH без SearchManager.APP_DATA).
0 голосов
/ 04 февраля 2012

В вашем примере вы запрашиваете набор ключей для исходного объекта намерения, а не Bundle, содержащий ваши данные appData.Вот пример, который должен работать:

private void handleIntent(Intent intent){
    final Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA);

    for (String key : appData.keySet()) {
        Log.d(TAG, "key="+appData.getString(key));
    }
}
0 голосов
/ 16 июня 2011

При вводе данных и их получении вы используете два разных ключа. при вводе вы используете "category" и при получении вы используете SearchManager.APP_DATA вместо "category"

Попробуйте с

Bundle appData = intent.getBundleExtra("category");

Спасибо Дипак

...