Как получить события поиска в android

Я использую вид поиска в моем приложении. Теперь я просто хочу набрать текст в текстовом поле SearchView и отобразить его в другом текстовом представлении. Если я набрал текст и нажал кнопку, я могу сделать то же самое. Но я не хочу использовать дополнительные кнопки. Я просто хочу отобразить результат, когда я нажимаю клавишу ввода.

Ответ 1

Попробуйте использовать setOnQueryTextListener SearchView

new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextChange(String newText) {
        // your text view here
        textView.setText(newText);
        return true;
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        textView.setText(query);
        return true;
    }
}

Ответ 2

Вышеприведенный ответ хорош, но не полностью на самом деле вам нужно установить прослушиватель действий для вашего поиска. вы можете сделать это двумя способами, создав класс, который реализует необходимые классы, чтобы быть OnQueryTextListener, и создать новый объект и использовать его в качестве текстового прослушивателя запроса поиска или использовать следующую компактную форму:

        SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                callSearch(query);
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
//              if (searchView.isExpanded() && TextUtils.isEmpty(newText)) {
                    callSearch(newText);
//              }
                return true;
            }

            public void callSearch(String query) {
                //Do searching
            }

        });

Ответ 3

Это также можно сделать с помощью RXAndroid и RxBinding от Jake Wharton следующим образом:

RxSearchView.queryTextChanges(searchView)
            .debounce(500, TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<CharSequence>() {
                @Override
                public void call(CharSequence charSequence) {
                    if(charSequence!=null){
                        // Here you can get the text
                        System.out.println("SEARCH===" + charSequence.toString());
                    }
                }
            });

Код подписывается на наблюдение за изменением текста с некоторой задержкой в ​​500 миллисекунд.

Это ссылка на git repo для получения RXAndroid: https://github.com/JakeWharton/RxBinding

Ответ 4

Это то, что у меня есть внутри функции onCreateOptionsMenu(Menu menu) в моей основной деятельности:

MenuItem searchItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        // Do whatever you need. This will be fired only when submitting.
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        // Do whatever you need when text changes. 
        // This will be fired every time you input any character.
        return false;
    }
});

Ответ 5

Правильный способ решить эту проблему - использовать setOnQueryTextListener

Это небольшой пример с использованием Kotlin:

txtSearch = rootView.searchView 
txtSearch.setOnQueryTextListener(object : SearchView.OnQueryTextListener {

        override fun onQueryTextChange(newText: String): Boolean {
            return false
        }

        override fun onQueryTextSubmit(query: String): Boolean {
            return false
        }
 })