片段中的 SearchView(activity 中的膨胀菜单)

SearchView in fragment (inflated menu in activity)

我在 SearchView.OnQueryTextListener 上获得了 NPE。

/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;
        }
    });
}

我正在 Activity 中扩充菜单(我需要隐藏复选标记并稍后在用户进行一些输入后启用它,所有逻辑都在 activity 中),在 Fragment 中,我有 RecyclerView,我需要执行搜索(在工具栏中)。所以基本上,我只需要访问 SearchView INSIDE FRAGMENT。 我一直在努力寻找任何东西,但没有任何帮助,如果我在 fragment 中膨胀 menu 然后我在 toolbar.

中得到双倍的图标
setHasOptionsMenu(true);

已添加到 onCreate

我也试过这个: 1. 在 fragment 中扩充菜单(在 activity 中删除了 onCreateOptionsMenu) 2. 通过界面将 menuItem(复选标记)传回 activity,这样我就可以访问复选标记 3. 如果我在 searchview

上设置侦听器,仍然会出现 NPE

我在片段中制作了选项菜单。像这样,

@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;
        }
    });
....
}  

不确定,您从 onCreateOptionsMenu 调用 "searchView.setOnQueryTextListener"。

已解决:

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

在 Fragment 上添加了 implements SearchView.OnQueryTextListener 和 2 个新的覆盖方法 onQueryTextSubmitonQueryTextChanged