Ответ 1
Вы также можете попробовать следующее:
searchView.setQuery("", false);
searchView.clearFocus();
У меня есть две активности: первая, HomepageActiviy
, есть виджет поиска, который ищет данные, используя другое действие, SearchActivity
.
Что я хочу сделать, когда я вернусь от SearchActiviy
до HomepageActivity
, виджет поиска обрушится и с пустым текстом.
Я попытался сделать следующее:
public class HomepageActivity extends Activity {
@TargetApi(11)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.projectslist, menu);
if(Build.VERSION.SDK_INT >= 11) {
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.homepage_search).getActionView();
ComponentName component = new ComponentName(this, SearchActivity.class);
searchView.setSearchableInfo(searchManager.getSearchableInfo(component));
searchView.setIconifiedByDefault(true);
searchView.setQuery("", false);
}
return super.onCreateOptionsMenu(menu);
}
[…]
@TargetApi(11)
@Override
protected void onRestart() {
super.onRestart();
if(Build.VERSION.SDK_INT >= 11)
invalidateOptionsMenu();
launchAsynchronousImageDownload();
}
}
Если виджет хорошо отображается как свернутый, текст в виджетах все еще запоминает искомый текст (после повторного открытия виджета). Как я могу reset текст виджета?
Спасибо за любую помощь!;)
Вы также можете попробовать следующее:
searchView.setQuery("", false);
searchView.clearFocus();
это волшебство
searchView.setQuery( "", ложь); //очистить текст
searchView.setIconified(true); //закрываем редактор поиска и снова ищем значок поиска
в HomepageActivity вставить функцию onSaveInstanceState после функции oncreate
эта функция будет запускаться каждый раз, когда вы открываете новое действие, , прежде чем открывать новую активность, будет reset значение Search Widget
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
searchView.setQuery("", false);
searchView.setIconified(true);
}
Это сработало для меня:
Сначала я объявил переменную элемента меню в верхней части действия:
private MenuItem mSearchMenuItem;
Я определил переменную в OnCreateOptionsMenu():
mSearchMenuItem = menu.findItem(R.id.action_search);
Я объявил invalidateOptionsMenu() в onResume():
@Override
protected void onResume() {
invalidateOptionsMenu();
super.onResume();
}
Наконец, я вызывал collapseActionView() в элементе меню в onPrepareOptionsMenu().
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
mSearchMenuItem.collapseActionView();
return super.onPrepareOptionsMenu(menu);
}
searchView.setQuery("", false);
searchView.setIconified(false);
У меня тоже была эта проблема, и это сработало, если я положил ее в onPrepareOptionsMenu.
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setQuery("", false);
// rest of code...
}
Просто нашел уродливый способ заставить его работать (читать комментарии, чтобы увидеть различия):
public class HomepageActivity extends Activity {
// Declaring SearchView as an instance object
private SearchView searchView;
@TargetApi(11)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.projectslist, menu);
if(Build.VERSION.SDK_INT >= 11) {
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
// Using instance var instead of local var
searchView = (SearchView) menu.findItem(R.id.homepage_search).getActionView();
ComponentName component = new ComponentName(this, SearchActivity.class);
searchView.setSearchableInfo(searchManager.getSearchableInfo(component));
searchView.setIconifiedByDefault(true);
// Setting query is not anymore required
//searchView.setQuery("", false);
}
return super.onCreateOptionsMenu(menu);
}
[…]
@TargetApi(11)
@Override
protected void onRestart() {
super.onRestart();
// Do not need to recreate menu
/*if(Build.VERSION.SDK_INT >= 11)
invalidateOptionsMenu();*/
if(Build.VERSION.SDK_INT >= 11) {
// Calling twice: first empty text field, second iconify the view
searchView.setIconified(true);
searchView.setIconified(true);
}
launchAsynchronousImageDownload();
}
}
Это довольно уродливо, я думаю, поэтому, если кто-нибудь, как лучшая идея, просто скажите мне:)
Здесь более чистое решение, оно исправляет следующее:
Нет необходимости в значении, если вы аннулируете, это делается автоматически.
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
searchView.setQuery("", false)
(activity as YourActivity).invalidateOptionsMenu()
}
Обязательно замените YourActivity
на имя действия, в котором у вас есть фрагмент.