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

Подсказки SearchView не отображаются для одного символа

Я работаю над приложением Android, написанным в Scala, которое использует android.support.v7.widget.SearchView внутри панели действий, которая переопределяется android.support.v7.widget.Toolbar.

В приложении мне нужно включить поисковые подсказки для этого SearchView. Поэтому каждый раз, когда я обнаруживаю изменение запроса, я проверяю, нужно ли обновлять предложения (код ниже). Если необходимо обновить предложения, вызов будет выполняться на бэкэнд и создается android.database.MatrixCursor, в котором содержатся предложения по поиску, и устанавливается в адаптере предложений SearchView (код ниже).

Проблема, с которой я сталкиваюсь, заключается в том, что подсказки поиска не будут отображаться при вводе символа одиночного. Ввод двух или более символов в поле поиска работает отлично.

Я попытался с android:searchSuggestThreshold установить в 0 и 1 в моей конфигурации XML, и я получаю тот же результат (например, этот параметр игнорируется): подсказки поиска, отображаемые для нескольких входных символов, но не отображающиеся для один символ.

Я что-то пропустил в конфигурации/инициализации SearchView? Как вариант, отличный от android:searchSuggestThreshold, который я могу установить? Я потратил последние несколько часов на поиск альтернативных вариантов, но не смог найти.

Возможное решение, которое я вижу, будет получать AutoCompleteTextView, поддерживая вход SearchView и устанавливая для него пороговое значение 1, но это уродливое (хакерское) решение, поскольку AutoCompleteTextView не отображается API SearchView.

Кто-нибудь знает элегантное решение для этого?

Спасибо!

Обнаружение изменений поискового запроса:

//this gets called whenever something is changed in the search box. "s" contains the entire search term typed in the search box
def onQueryTextChange(s: String): Boolean = {
  //this checks to see if a call should be made to the backend to update suggestions
  SearchSuggestionController.query(s) 
  //return false as we're not consuming the event
  false
}

Обновление предложений по поиску:

def updateSuggestions(suggestions: Array[String]): Unit = {
  val cursor = new MatrixCursor(Array(BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1), suggestions.length)
  for{
    i <- suggestions.indices
    s = suggestions(i)
  } cursor.addRow(Array[AnyRef](i.toString, s))

  getActivity.runOnUiThread(() => {
    searchSuggestionAdapter.changeCursor(cursor)
    searchSuggestionAdapter.notifyDataSetChanged()
  })
}

Инициализация меню SearchView:

override def onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) = {
    inflater.inflate(R.menu.menu_products, menu)
    val searchManager = getActivity.getSystemService(Context.SEARCH_SERVICE).asInstanceOf[SearchManager]
    val actionItem = menu.findItem(R.id.action_search)
    searchView = MenuItemCompat.getActionView(actionItem).asInstanceOf[SearchView]
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity.getComponentName))
    searchView.setSubmitButtonEnabled(false)
    SearchSuggestionController.onSuggestionsProvided_=(updateSuggestions)
    searchView setSuggestionsAdapter searchSuggestionAdapter
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      //...
      //change listener for detecting search changes presented above
      //...
    }
  //...
  //initialise other components 
  //...
}

Конфигурация для поиска:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:hint="@string/actionbar_products_search_hint"
    android:searchSuggestThreshold="0"
    android:searchSuggestSelection=" ?"/>
4b9b3361

Ответ 1

Вы должны обработать объект SearchAutoComplete, который использует объект SearchView, а затем прагматически установить его порог в 1. (если вы попытаетесь установить его на 0, он станет 1, он будет реализован так, как за кулисами), к сожалению, он не будет работать из XML по какой-то причине.

SearchView.SearchAutoComplete mSearchSrcTextView = (SearchView.SearchAutoComplete) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
// show results from 1 char
mSearchSrcTextView.setThreshold(1);

Ответ 2

Я вижу вашу точку зрения о "элегантном решении" здесь, что очень приятно, но я боюсь, что Android API заставит вас много раз делать "неэлегантный" в любом случае, если вы хотите достичь своих целей:)

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

Получить экземпляр EditText:

AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);

И заставить показать предложения в onQueryTextChange для длины текста равно 1:

if(s.length() == 1){
   searchText.showDropDown();
{

Ответ 3

Установите OnQueryTextListener в свой SearchView. Используйте onQueryTextChange для обновления адаптера.