Подтвердить что ты не робот

Сброс значения Search Widget (SearchView)

У меня есть две активности: первая, 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 текст виджета?

Спасибо за любую помощь!;)

4b9b3361

Ответ 1

Вы также можете попробовать следующее:

searchView.setQuery("", false);
searchView.clearFocus();

Ответ 2

это волшебство

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);
    }

Ответ 3

Это сработало для меня:

Сначала я объявил переменную элемента меню в верхней части действия:

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);
}

Ответ 4

searchView.setQuery("", false);
searchView.setIconified(false);

Ответ 5

У меня тоже была эта проблема, и это сработало, если я положил ее в onPrepareOptionsMenu.

@Override
public boolean onPrepareOptionsMenu (Menu menu) {
     SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
     searchView.setQuery("", false);
     // rest of code...
}

Ответ 6

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

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();
    }
}

Это довольно уродливо, я думаю, поэтому, если кто-нибудь, как лучшая идея, просто скажите мне:)

Ответ 7

Котлин

Здесь более чистое решение, оно исправляет следующее:

  1. Проблема с отображением отфильтрованного списка после поворота экрана.
  2. Проблема с отображением отфильтрованного списка, когда пользователь переключается на другое приложение и возвращается обратно.
  3. Ошибка смещения меню поиска влево при возврате пользователя.

Нет необходимости в значении, если вы аннулируете, это делается автоматически.


override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    searchView.setQuery("", false)
    (activity as YourActivity).invalidateOptionsMenu()
}

Обязательно замените YourActivity на имя действия, в котором у вас есть фрагмент.