package yuku.searchbar; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; import android.widget.FrameLayout; import android.widget.SearchView; import yuku.androidsdk.searchbar.SearchBar; @TargetApi(11) public class SearchWidget extends FrameLayout { public static final String TAG = SearchWidget.class.getSimpleName(); public interface OnQueryTextListener { /** * Called when the query text is changed by the user. * * @param newText the new content of the query text field. * * @return false if the SearchView should perform the default action of showing any * suggestions if available, true if the action was handled by the listener. */ boolean onQueryTextChange(SearchWidget searchWidget, String newText); /** * Called when the user submits the query. This could be due to a key press on the * keyboard or due to pressing a submit button. * The listener can override the standard behavior by returning true * to indicate that it has handled the submit request. Otherwise return false to * let the SearchView handle the submission by launching any associated intent. * * @param query the query text that is to be submitted * * @return true if the query has been handled by the listener, false to let the * SearchView perform the default action. */ boolean onQueryTextSubmit(SearchWidget searchWidget, String query); } public static abstract class SimpleOnQueryTextListener implements OnQueryTextListener { @Override public boolean onQueryTextChange(SearchWidget searchWidget, String newText) { return false; }; @Override public boolean onQueryTextSubmit(SearchWidget searchWidget, String query) { return false; }; } SearchBar searchBar; SearchView searchView; private OnQueryTextListener listener; public SearchWidget(Context context) { super(context); init(); } public SearchWidget(Context context, AttributeSet attrs) { super(context, attrs); init(); } @TargetApi(11) private void init() { LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); if (Build.VERSION.SDK_INT >= 11) { searchView = new SearchView(getContext()); searchView.setIconifiedByDefault(false); searchView.setSubmitButtonEnabled(true); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { if (listener != null) { return listener.onQueryTextSubmit(SearchWidget.this, query); } return false; } @Override public boolean onQueryTextChange(String newText) { if (listener != null) { return listener.onQueryTextChange(SearchWidget.this, newText); } return false; } }); this.addView(searchView, lp); } else { searchBar = new SearchBar(getContext()); searchBar.setOnSearchListener(new SearchBar.OnSearchListener() { @Override public void onSearch(SearchBar searchBar, Editable text) { if (listener != null) { listener.onQueryTextSubmit(SearchWidget.this, text.toString()); } } }); searchBar.getSearchField().addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) {} @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void afterTextChanged(Editable s) { if (listener != null) { listener.onQueryTextChange(SearchWidget.this, s.toString()); } } }); this.addView(searchBar, lp); } } /** * Enables showing a submit button when the query is non-empty. In cases where the SearchView * is being used to filter the contents of the current activity and doesn't launch a separate * results activity, then the submit button should be disabled. * * @param enabled true to show a submit button for submitting queries, false if a submit * button is not required. */ public void setSubmitButtonEnabled(boolean enabled) { if (searchView != null) searchView.setSubmitButtonEnabled(enabled); // TODO for searchBar } public SearchBar getSearchBarIfUsed() { return searchBar; } public SearchView getSearchViewIfUsed() { return searchView; } public void setOnQueryTextListener(OnQueryTextListener listener) { this.listener = listener; } public void setHint(CharSequence hint) { if (searchView != null) searchView.setQueryHint(hint); else searchBar.getSearchField().setHint(hint); } public void setHint(int resId) { setHint(getContext().getText(resId)); } public void setText(CharSequence text) { if (searchView != null) searchView.setQuery(text, false); else searchBar.getSearchField().setText(text); } public void setText(int resId) { setText(getContext().getText(resId)); } public CharSequence getText() { if (searchView != null) return searchView.getQuery(); return searchBar.getText(); } }