开发者

how to get the events of searchview in android

I'm using a search view in my application. Now i just want to get the text typed in the SearchView text box and display it on another textview. If i typed t开发者_StackOverflowhe text and click a button i can do the same. But i don't want to use any extra buttons. I just want to display the result when i am pressing enter key.


Try to use setOnQueryTextListener of 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;
    }
}


The above answer is good but not complete actually you need to set an action listener for your Search view . you can do this in two ways create a class that implements the necessary classes to be an OnQueryTextListener and make a new object of that and use it as your search view query text listener or use the following compact form:

        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
            }

        });


It also can be done with RXAndroid and RxBinding by Jake Wharton like this:

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());
                    }
                }
            });

Code is subscribing to observe text change with some delay of 500 milliseconds.

This is a link to git repo to get RXAndroid: https://github.com/JakeWharton/RxBinding


In Kotlin, you can do :

searchView.setOnQueryTextListener(object : OnQueryTextListener {

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

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

})


The right way to solve this is to use setOnQueryTextListener

This is a small exmple using 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
        }
 })


This is what I have inside the onCreateOptionsMenu(Menu menu) function on my main activity:

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;
    }
});


with extension functions, create SearchViewExtensions.kt

import android.view.View
import androidx.appcompat.widget.SearchView

inline fun SearchView.onQueryTextChanged(crossinline listener: (String) -> Unit) {
    this.setOnQueryTextListener(object: SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String?): Boolean {
            return true
        }

        override fun onQueryTextChange(newText: String?): Boolean {
            listener(newText.orEmpty())
            return true
        }
    })
}

and the magic in your fragment

mSearchView.onQueryTextChanged { query: String ->
     // do whatever
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜