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