Reputation: 79
I'm trying to add recent searches to the SearchView on a toolbar:
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
if (s!= null )
{
if (s.isEmpty()){
loadRecentList();
}
else{
search(s);
}
}
return true;
}
});
The search is working fine, but I can't see the recent list results.
I found this Android SearchView.OnQueryTextListener OnQueryTextSubmit not fired on empty query string
but modifying the ActionBar library is not a nice solution.
Does anyone have another solution? Thanks.
Edit:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main_activity, menu);
searchItem = menu.findItem(R.id.btn_earch);
initSearchView();
setSearchViewListener();
return super.onCreateOptionsMenu(menu);
}
protected void initSearchView() {
final String CURSOR_RESOURCE_ID = "mCursorDrawableRes";
final int THRESHOLD = 1;
mSearchView = (SearchView) searchItem.getActionView();
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
mSearchView.setMeasureWithLargestChildEnabled(true);
autoCompleteTextView = (AutoCompleteTextView) mSearchView.findViewById(R.id.search_src_text);
autoCompleteTextView.setThreshold(THRESHOLD);
}
protected void setSearchViewListener() {
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
if (s!= null )
{
if (s.isEmpty()){
loadRecentList();
}
else{
search(s);
}
}
return true;
}
});
btn_search item:
<item
android:id="@+id/btn_search"
android:icon="@drawable/ic_search_small"
android:title="@string/tooltip_search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always"
/>
Upvotes: 7
Views: 11286
Reputation: 165
you can achieve this by create custom SearchView widget like this :
import android.content.Context;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.SearchView;
public class EmptySubmitSearchView extends SearchView {
SearchView.SearchAutoComplete mSearchSrcTextView;
OnQueryTextListener listener;
public EmptySubmitSearchView(@NonNull Context context) {
super(context);
}
public EmptySubmitSearchView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public EmptySubmitSearchView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void setOnQueryTextListener(OnQueryTextListener listener) {
super.setOnQueryTextListener(listener);
this.listener = listener;
mSearchSrcTextView = this.findViewById(androidx.appcompat.R.id.search_src_text);
mSearchSrcTextView.setOnEditorActionListener((textView, i, keyEvent) -> {
if (listener != null) {
listener.onQueryTextSubmit(getQuery().toString());
}
return true;
});
}
}
reference from this link, i just migrated it to support AndroidX
Upvotes: 1
Reputation: 220
I solve it with something like this
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
Log.i("MyApp", searchView.getQuery().toString());
consultarListaParadas(searchView.getQuery().toString());
getActivity().runOnUiThread(new Runnable() {
public void run() {
adaptadorListaParadasBus.setListaParadas(listaParadas);
adaptadorListaParadasBus.notifyDataSetChanged();
}
});
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
if(newText.equals("")){
this.onQueryTextSubmit("");
}
return true;
}
});
The only problem is that it throws without you press the search button.
Upvotes: 6
Reputation: 4408
The queryTextListener wont fire on an empty string event. A solution is to find the underlining EditText on the SearchView and attach a TextWatcher to that.
Recursive method to find a view of EditText
private EditText getEditText(final Context context, final View v) {
try {
if (v instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++) {
View child = vg.getChildAt(i);
View editText = getEditText(context, child);
if (editText instanceof EditText) {
return (EditText) editText;
}
}
} else if (v instanceof EditText) {
Log.d(LogUtil.RANDOM_TAG, "found edit text");
return (EditText) v;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return null;
}
then when you have your SearchView
EditText et = getEditText(getActivity(), searchView);
if (et != null) {
et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if(TextUtils.isEmpty(s)){
Log.d(LogUtil.RANDOM_TAG, "empty");
//do stuff
}
else{
Log.d(LogUtil.RANDOM_TAG, "not empty");
}
}
});
}
Upvotes: 0
Reputation: 3157
@Gali,
Please take a look at my code:
1) I created ActionBar Activity like that:
public class CarsActivity extends ActionBarActivity implements ExpandableListView.OnGroupClickListener
{
//my class fields:
private MenuItem _menu_item;
private SearchView _searchView;
// .......
//here is my OnCreateOptionMenu method:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_cars_activity, menu);
_menu_item = menu.findItem(R.id.action_search);
_searchView = (SearchView) MenuItemCompat.getActionView(_menu_item);
_searchView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View v)
{
//action when search is displayed on actinbar
}
@Override
public void onViewDetachedFromWindow(View v)
{
//action when search is collaped on actinbar
}
});
_searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s)
{
return true;
}
@Override
public boolean onQueryTextChange(String s)
{
//listener for entering text in searchView
//you can implement it your way
return false;
}
});
return true;
}
}
Hope it will help you.
Upvotes: 0