Search code examples
javaandroidandroid-fragmentssearchview

SearchView in fragment (inflated menu in activity)


I get NPE on SearchView.OnQueryTextListener.

/res/menu/order_toolbar.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item
    android:id="@+id/order_menu_search"
    android:icon="@drawable/ic_search"
    android:title="@string/order_menu_search"
    app:actionViewClass="android.support.widget.v7.SearchView"
    app:showAsAction="ifRoom|withText" />

<item
    android:id="@+id/order_menu_checkmark"
    android:icon="@drawable/ic_checkmark"
    android:title="@string/order_toolbar"
    app:showAsAction="ifRoom|withText" />

ActivityOrder.java

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.order_toolbar, menu);
    mMenuCheckmark = menu.findItem(R.id.order_menu_checkmark);
    mMenuCheckmark.setVisible(false);
    return super.onCreateOptionsMenu(menu);
}

FragmentOrder.java

    @Override
public void onPrepareOptionsMenu(Menu menu){
    MenuItem menuItem = menu.findItem(R.id.order_menu_search);
    SearchView searchView = (SearchView) menuItem.getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
        Toast.makeText(getActivity(), "" +newText, Toast.LENGTH_SHORT).show();
            return false;
        }
    });
}

I'm inflating menu in Activity (i need to hide checkmark and enable it later after the user made some input, all the logic is in the activity), and in Fragment, I have RecyclerView and I need to implement search (in the toolbar). So basically, I need to access that SearchView INSIDE FRAGMENT only. I have been trying to find anything but nothing helps, if I inflate menu in fragment then I get doubled icons in the toolbar.

setHasOptionsMenu(true);

is already added in onCreate

Also i tried this: 1. inflate the menu in fragment (removed onCreateOptionsMenu in activity) 2. passed menuItem (checkmark) back to activity trough interface so i can access checkmark 3. still getting NPE if i set listener on searchview


Solution

  • Solved:

       mMenuSearch = (SearchView) menu.findItem(R.id.order_menu_search).getActionView();
            mMenuSearch.setOnQueryTextListener(this);
    

    added implements SearchView.OnQueryTextListener on Fragment and 2 new Override methods onQueryTextSubmit and onQueryTextChanged