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
В моем случае он не работал, потому что фрагмент, в котором я был, больше не привязан к окну. Переместив его выше, где я поменялся на новый фрагмент результатов поиска, он зафиксировал его.