У меня есть складной SearchView в моем ActionBar. После того, как поиск выполнен, связанный ListView фильтруется, чтобы отображать только соответствующие элементы. Во время этого состояния SearchView все еще расширяется и отображает строку поиска. Если пользователь закрывает SearchView, я удаляю фильтр.
Я хочу восстановить состояние поиска, например. при изменении конфигурации или если действие было уничтожено, когда я возвращаюсь к нему из другого действия.
Я восстанавливаю строку запроса в onRestoreInstanceState(), и если я найду строку запроса в onCreateOptionsMenu(), я вызываю
searchView.setQuery(query, true);
чтобы выполнить запрос еще раз. Оказалось, что это лучше, чем сразу применить фильтр запросов onRestoreInstanceState(). С последним список вкратце показан нефильтрованным, только тогда запрос снова применяется. С setQuery() этого не происходит.
Проблема: запрос выполняется, и список фильтруется, но окно поиска остается свернутым. Поэтому пользователь не может использовать представление поиска, чтобы удалить фильтр или применить другой запрос.
В onCreateOptionsMenu() я могу быть уверен, что элемент поиска и вид поиска существуют, поэтому я могу позвонить searchItem.expandActionView(). Как ни странно, только это действительно расширяет ActionView - вызов setIconified(false) не расширяет представление, даже если он вызывается дважды в строке.
Если я использую expandActionView(), прежде чем я вызову setQuery(), откроется SearchView и покажет текст (иначе expandActionView() пустет SearchView).
К сожалению, expandActionView() имеет побочный эффект: также отображается список предложений и открывается клавиатура.
Я могу скрыть клавиатуру, используя searchView.clearFocus(). Таким образом, оставшаяся проблема - список предложений. Как закрыть открытый список предложений на SearchView с текстом?
Интересно, есть ли лучший способ восстановить представление поиска в панели действий, в которой не так много побочных эффектов.