简体   繁体   中英

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

I make option menu in fragment. Like this,

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
...
setHasOptionsMenu(true);
...
}


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.fragment_menu, menu);
    menu.findItem(R.id.menu_1).setIcon(ContextCompat.getDrawable(activity, R.drawable.ic_bar_search));
    searchView = (SearchView) menu.findItem(R.id.menu_1).getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            return false;
        }
    });
    searchView.setOnCloseListener(new SearchView.OnCloseListener() {
        @Override
        public boolean onClose() {
            return false;
        }
    });
....
}  

Not sure, you call "searchView.setOnQueryTextListener" from onCreateOptionsMenu.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM