OnCloseListener в SearchView не работает - PullRequest
93 голосов
/ 17 февраля 2012

Я пытаюсь добавить поддержку SearchView в панели действий Android 3.0+, но не могу заставить OnCloseListener работать.

Вот мой код:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    searchView = (SearchView) menu.findItem(R.id.search_textbox).getActionView();
    searchView.setOnQueryTextListener(new OnQueryTextListener() {
        @Override
        public boolean onQueryTextChange(String newText) {
            searchLibrary(newText);
            return false;
        }
        @Override
        public boolean onQueryTextSubmit(String query) { return false; }
    });
    searchView.setOnCloseListener(new OnCloseListener() {
        @Override
        public boolean onClose() {
            System.out.println("Testing. 1, 2, 3...");
            return false;
        }
    });
    return true;
}

Поиск отлично работает, и все работают, кроме OnCloseListener.Ничего не печатается в Logcat.Вот Logcat, когда я нажимаю кнопку «Закрыть»:

02-17 13:01:52.914: I/TextType(446): TextType = 0x0
02-17 13:01:57.344: I/TextType(446): TextType = 0x0
02-17 13:02:02.944: I/TextType(446): TextType = 0x0

Я просмотрел документацию и образцы, но, похоже, ничего не изменило.Я использую его на Asus Transformer Prime и Galaxy Nexus, оба на Ice Cream Sandwich.Есть идеи?

Обновление:

Да - System.out.println() работает работает.Вот доказательство:

   @Override
 public boolean onQueryTextChange(String newText) {
    System.out.println(newText + "hello");
    searchLibrary(newText);
    return false;
 }

Результаты в этом Logcat:

02-17 13:04:20.094: I/System.out(21152): hello
02-17 13:04:24.914: I/System.out(21152): thello
02-17 13:04:25.394: I/System.out(21152): tehello
02-17 13:04:25.784: I/System.out(21152): teshello
02-17 13:04:26.064: I/System.out(21152): testhello

Ответы [ 17 ]

0 голосов
/ 31 августа 2017

Это обходной путь, но он сработал для меня

  searchView.setOnQueryTextListener(new android.widget.SearchView.OnQueryTextListener() {

                String lastText;

                @Override
                public boolean onQueryTextChange(final String newText) {
                    if (lastText != null && lastText.length() > 1 && newText.isEmpty()) {
                        // close ctn clicked

                        return true;
                    }
}
0 голосов
/ 12 августа 2013

кажется уже старым потоком, но я думал, что я получил ту же проблему API 18 в первом начале. После того, как погуглил, нашел эту ветку, еще час прочитал, что javadoc попробовал и допустил ошибку из-за чего-то, что я не претендую на то, что полностью понимаю в javadoc, следующая работа для меня сейчас:

searchView.setIconifiedByDefault(true);

   // OnQueryTextListener
   @Override
   public boolean onQueryTextSubmit(String query) {
      Log.d(tag, "onQueryTextSubmit: " + query);
      return true;
   }

   @Override
   public boolean onQueryTextChange(String query) {
      Log.d(tag, "onQueryTextChange: " + query);
      return true;
   }

   // OnCloseListener
   @Override
   public boolean onClose() {
      Log.w(tag, "onClose: ");
      return false;
   }

Я немного поиграл с true / false, это как-то имеет значение, и теперь это работает для меня. Надеюсь, это может сэкономить кому-то время.

0 голосов
/ 28 ноября 2012

Причина, по которой OnCloseListener не вызывается, состоит в том, что в коде Android есть ошибка - слушатель вызывается, только если вы также вызываете setIconifiedByDefault(true).

0 голосов
/ 03 апреля 2012

Существует два общих шаблона для SearchView.setOnCloseListener(). Это действительно верно для всех слушателей, но я обращаюсь конкретно к вашему вопросу. Первый способ - создать функцию слушателя и присоединить ее к переменной-члену, а второй - заставить класс реализовать интерфейс и сделать обработчик функцией-членом.

Создание объекта слушателя выглядит так:

private SearchView mSearchView;
private final SearchView.OnCloseListener mOnCloseListener = 
    new SearchView.OnCloseListener() {
        public boolean onClose() {
            doStuff();
            return myBooleanResult;
        }
    };
mSearchView.setOnCloseListener(mOnCloseListener);

Реализация слушателя на уровне класса выглядит следующим образом:

public class MyClass implements OnCloseListener {
    private SearchView mSearchView;

    public MyClass(...) {
        mSearchView.setOnCloseListener(this);
    }

    @Override
    public boolean onClose() {
        doStuff();
        return false;
    }
}

Я не видел ни одного примера, создающего OnCloseListener ad-hoc, как вы сделали в своем вопросе.

0 голосов
/ 20 сентября 2018
    searchView.setOnCloseListener {
        d("click", "close clicked")
        return@setOnCloseListener false
    }

, если вы нажмете на закрыть searchView ->

D / клик: близко кликнул

0 голосов
/ 05 марта 2019

Я столкнулся с этой проблемой, пытаясь обнаружить показ или отклонение SearchView. В итоге я использовал другой слушатель, и он работал для того, что мне нужно:

        setOnQueryTextFocusChangeListener { _, hasFocus ->
            if (hasFocus) {
                // SearchView is being shown
            } else {
                // SearchView was dismissed
            }
        }
0 голосов
/ 17 февраля 2012

В Android нет консоли для входа.Вместо этого используйте платформу регистрации Android:

Log.d("Test Tag", "Testing.  1, 2, 3...");

См. Также этот вопрос: Почему «System.out.println» не работает в Android?

...