SearchView в одном действии, результаты в другом

Мой вариант использования следующий: в действии A у меня есть панель действий со сворачиваемым SearchView. Когда пользователь задает свой запрос и нажимает кнопку «поиск», я хотел бы показать действие B с результатами. Я не могу этого сделать, вот мой код:

searchchable.xml:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
            android:hint="@string/action_search_hint"
            android:label="@string/app_name"/>

Деятельность А:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

    return true;
}

AndroidManifest для действий A и B:

    <activity
        android:name=".ActivityA">

        <intent-filter>

            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>

        </intent-filter>

    </activity>

    <activity android:name=".ActivityB">

        <intent-filter>

            <action android:name="android.intent.action.SEARCH"/>

        </intent-filter>

        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable"/>

    </activity>

Хауэрвер, что бы я ни пытался, getSearchableInfo в A всегда возвращает null.

Такое чувство, что я чего-то не понимаю. Единственный способ заставить getSearchableInfo () возвращать значение, отличное от null, - это поместить фильтр намерения SEARCH и доступные для поиска метаданные в действие A в манифесте. Но затем, когда я нажимаю кнопку «поиск», другой экземпляр действия A запускается снова поверх текущего, что определенно не то, что я хочу. Думаю, я мог бы добавить singleTop к A и обработать действие SEARCH в onNewIntent и запустить B, но обычно я не хочу, чтобы A был singleTop, я хочу значение по умолчанию. Или я?

Я попытался добавить это к A в манифесте (как предлагалось в некоторых других потоках):

    <meta-data
        android:name="android.app.default_searchable"
        android:value=".ActivityB" >
    </meta-data>

Что я делаю неправильно?

РЕДАКТИРОВАТЬ: я заменил строку getComponentName () в A следующим:

searchView.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, ActivityB.class)));

и вроде работает так, как я хочу! Я здесь что-то не так делаю или это правильный путь? Я немного сомневаюсь, потому что это нигде не упоминается!


person wujek    schedule 01.02.2015    source источник
comment
В документе говорится, что getSearchableInfo(componentName) принимает один аргумент, который является «действием, для которого нужно получить доступную для поиска информацию». В вашем случае вам нужен ActivityB, поэтому создание ComponentName, указывающего на ActivityB, является правильным способом.   -  person hidro    schedule 02.02.2015
comment
@hidro - Я приму ваш ответ, если вы его напишете.   -  person wujek    schedule 17.02.2015
comment
Большое спасибо за этот вопрос. Спасен после четырех часов потраченного впустую времени.   -  person X09    schedule 11.08.2016


Ответы (2)


Согласно документации Android, SearchManager.getSearchableInfo(componentName) принимает один аргумент, который является:

componentName: действие, чтобы получить доступную для поиска информацию

В вашем случае вам понадобится ActivityB, поэтому создание ComponentName, которое указывает на ActivityB, является правильным способом.

new ComponentName(this, ActivityB.class)
person hidro    schedule 26.02.2015
comment
Работает как по волшебству. Я не могу дать больше одного голоса, иначе я мог бы дать миллион. - person X09; 11.08.2016

<intent-filter>
            <action android:name="android.intent.action.SEARCH"/>
        </intent-filter>

добавьте этот фильтр намерений к действию A.

2.Меню SearchView

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        searchView = (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setSearchableInfo(searchManager
                .getSearchableInfo(getComponentName()));

xml:

  <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/search"
        android:actionViewClass="android.widget.SearchView"
        android:icon="@drawable/ic_action_search"
        android:showAsAction="collapseActionView|always"
        android:title="@string/search_hint"/>

</menu>

3. Вызовите этот метод из oncreate.

private void handleIntent(Intent intent) {
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query = intent.getStringExtra(SearchManager.QUERY);

            Debug.e("Suggestion handle click", "call " + query);

            startNextActivity(query);

        }
    }

4. если вы используете Autosuggestion Listview, реализуйте searchView.setOnQueryTextListener, setOnSuggestionListener и setSuggestionsAdapter.

person SreeAndroidDev    schedule 02.02.2015
comment
Я не хочу, чтобы А понимал цель поиска, в этом весь смысл моего вопроса, извините, если я не совсем понял. - person wujek; 02.02.2015