Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use "SearchView" in Actionbar with ActionbarSherlock

I am trying to "Search" in ActionbarSherlock ver 4.2. ActionbarSherlock has backported SerchView in the latest version.

I have the following code in onCreateOptionsMenu of SherlockListFragment

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Place an action bar item for searching.
        SearchView searchView = new SearchView(getSherlockActivity().getSupportActionBar().getThemedContext());
        searchView.setQueryHint("Search Friends");
        searchView.setIconified(true);

        menu.add(Menu.NONE, Menu.FIRST, Menu.FIRST, "Refresh")
                .setIcon(R.drawable.ic_action_refresh)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
        menu.add(Menu.NONE, Menu.FIRST + 1, Menu.FIRST + 1, "Search")
                .setIcon(R.drawable.abs__ic_search)
                .setActionView(searchView)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

    }

and the following code in the

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case Menu.FIRST:
            Toast.makeText(getActivity(),"FIRST", Toast.LENGTH_SHORT).show();
            break;
         case Menu.FIRST + 1:
             Toast.makeText(getActivity(),"FIRST+1", Toast.LENGTH_SHORT).show();
            break;
    }
    return super.onOptionsItemSelected(item);
}

I am getting Toast when I click on the "Refresh" button in the ABS but no response when when I click on the "search" it expands and gets converted into EditText but Toast is not fired.

My Question

How to integrate "search" in Actionbar with ABS?

like image 674
Gaurav Agarwal Avatar asked Jan 27 '26 03:01

Gaurav Agarwal


1 Answers

It works.

For implementation of SearchView we need to implement callback interface like this

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            /**
             * 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 newText 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.
             */
            @Override
            public boolean onQueryTextSubmit(String newText) {

                return true;
            }


            /**
             * 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.
             */
            @Override
            public boolean onQueryTextChange(String newText) {

                ThizLog.d(TAG, "Inside onQueryTextChange");
                // called when the action bar search text has changed.  Update
                // the search filter, and restart the loader to do a new query
                // with this filter.
                String newFilter = !TextUtils.isEmpty(newText) ? newText : null;
                // Don't do anything if the filter hasn't actually changed.
                // Prevents restarting the loader when restoring state.
                if (mCurFilter == null && newFilter == null) {
                    return true;
                }
                if (mCurFilter != null && mCurFilter.equals(newFilter)) {
                    return true;
                }
                mCurFilter = newFilter;
                getLoaderManager().restartLoader(0, null, this);
                return true;
            }
        });

in this particular case we need to pass the text entered by the user to the CursorLoader and let it reload the cursor with the appropriate results.

like image 54
Gaurav Agarwal Avatar answered Jan 28 '26 18:01

Gaurav Agarwal