SearchView setQuery не работает

Я использую интерфейс поиска в andriod, и, следуя руководству android, я установил интерфейс.

Я создаю SearchableActivity, который будет обрабатывать как пользователь, вводят результат поиска.

Теперь я сталкиваюсь с проблемой в том, что когда пользователь вводит что-то в SearchView и нажимает на ключ поиска, будет отправлен запрос requset, затем я получу строку запроса и выполняю поиск, но в этот момент текст в SearchView был изменен на значение по умолчанию SearchHit, в то время как я хочу, чтобы оно было строкой запроса.

Итак, я попытался использовать searchView.setQuery(query, false);, но он не работает, что проблема?

Основные коды действий:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_activity_layout);

    Log.d("map", "create");
    handleIntent(getIntent());
}

public void onNewIntent(Intent intent) {
    setIntent(intent);
    handleIntent(intent);
}

private void handleIntent(Intent intent) {
    Log.d("map", "handleIntent");
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        //try search
        Log.d("map", "search and set query:" + query);
        searchView.setQuery(query, false); // reset the value in of the SearchView
    }
}

AndroidManifest.xml:

    <activity
        android:name=".ui.MapActivity"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
    </activity>

Ответ 1

Я предлагаю вам отложить настройку до следующего цикла событий (добавить его в очередь сообщений), поэтому код может выглядеть следующим образом:

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

            @Override
            public void run() {
                // Important! Make sure searchView has been initialized
                // and referenced to the correct (current) SearchView.
                // Config changes (e.g. screen rotation) may make the
                // variable value null.
                searchView.setQuery(query, false);
            }
        };
    }
}

Ответ 2

Это не работает

    mSearchView.setQuery(mKeyword, true);
    MenuItemCompat.expandActionView(mMenuSearch);

Это делает

    MenuItemCompat.expandActionView(mMenuSearch);
    mSearchView.setQuery(mKeyword, true);

Кажется, он только помнит об этом после того, как вы расширили представление действия. Я использую MenuItemCompat только для обратной совместимости

Ответ 3

Кажется, что когда будет достигнуто намерение с действием Intent.ACTION_SEARCH, будет вызван следующий метод:

handleIntent();

onCreateOptionsMenu();

И handleIntent будет запущен до onCreateOptionsMenu.

В то же время люди использовали для настройки searchView в onCreateOptionsMenu.

Это означает, что меню параметров будет повторно завышено, а searchView будет перестроено, тогда все настройки в handleIntent не будут работать.

Я думаю, что это и есть причина.

Пожалуйста, не стесняйтесь исправить меня, если я ошибаюсь.

Ответ 4

нужно поставить код в обработчике сообщений с помощью MenuItemCompat

inflater.inflate(R.menu.menu_my_team, menu);
    // search manager integration for search widget
    SearchManager searchManager = (SearchManager) getActivity()
            .getSystemService(Context.SEARCH_SERVICE);
    final MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    //    MenuItem helpTutorialMenuItem = menu.findItem(R.id.action_help);
    mSearchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);

    mSearchView.setSearchableInfo(searchManager
            .getSearchableInfo(getActivity().getComponentName()));

    mSearchView.setQueryHint("Search by");

    if (!TextUtils.isEmpty(queryText)) {
        mSearchView.post(new Runnable() {
            @Override
            public void run() {
                MenuItemCompat.expandActionView(searchMenuItem);
                mSearchView.setQuery(queryText, false);
            }
        });
    }
    mSearchView.clearFocus();

Ответ 5

В моем случае он не работал, потому что фрагмент, в котором я был, больше не привязан к окну. Переместив его выше, где я поменялся на новый фрагмент результатов поиска, он зафиксировал его.