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 the 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.
-
i tried many listeners,but none of them r working.i dnt knw d reason... – andro-girl Apr 19 '11 at 10:28
7 Answers
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;
}
}
-
2
-
2No, listener or not, onQueryTextSubmit does not work when the string entered is empty. – Yoann Hercouet May 30 '13 at 14:04
-
@HighFlyer is there any event on load of searchview (after it's expanded and keyboard is shown). I have been struggling with this since long time. [Question Link](http://stackoverflow.com/questions/25158248/is-there-any-listener-on-android-searchview-to-notify-if-searchview-is-expanded/25158420) – Pradeep Sharma Aug 07 '14 at 11:45
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

- 5,639
- 2
- 21
- 16
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
}
})

- 3,753
- 5
- 40
- 73
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
}
})

- 929
- 14
- 28
-
While this code may solve the question, [including an explanation](//meta.stackexchange.com/q/114762) of how and why this solves the problem would really help to improve the quality of your post, and probably result in more up-votes. Remember that you are answering the question for readers in the future, not just the person asking now. Please [edit] your answer to add explanations and give an indication of what limitations and assumptions apply. – double-beep May 22 '19 at 11:43
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;
}
});

- 86
- 1
- 7
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
}

- 24,861
- 16
- 87
- 111
-
I just did the same extension for my project!! But I was not aware about the .orEmpty() method. Thanks :D – Leonardo Sibela Mar 30 '23 at 02:15