【问题标题】:SearchView in fragment (inflated menu in activity)片段中的 SearchView(活动中的膨胀菜单)
【发布时间】:2017-09-29 08:34:54
【问题描述】:

我在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 中膨胀菜单(我需要隐藏复选标记并在用户进行一些输入后启用它,所有逻辑都在活动中),在片段中,我有RecyclerView,我需要实现搜索(在工具栏中)。所以基本上,我只需要访问SearchView INSIDE FRAGMENT。 我一直在尝试寻找任何东西,但没有任何帮助,如果我在fragment 中膨胀menu,那么我会在toolbar 中得到双倍的图标。

setHasOptionsMenu(true);

已经添加到onCreate

我也试过这个: 1.在fragment中充气菜单(移除了activity中的onCreateOptionsMenu) 2.将menuItem(复选标记)传回活动槽界面,以便我可以访问复选标记 3. 如果我在 searchview 上设置监听器,仍然会得到 NPE

【问题讨论】:

  • 如果可以,您可以在 onCreateOptionsMenu 中编写代码。不在 onPrepareOptionsMenu 中
  • 正如我已经说过的,如果我在 Fragment 中膨胀,我会得到双倍的图标。 Fragment 的目的是从活动中获取可序列化列表并将其传递给 RecyclerView 的适配器,因为我需要显示不同类型的排序(基于 Firebase 的值)
  • 您可以在片段中制作选项菜单。您在 Fragment 中使用 'setHasOptionsMenu(true)'。

标签: java android android-fragments searchview


【解决方案1】:

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

@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”。

【讨论】:

  • 但是如果我在片段中膨胀菜单,那么我如何在活动中获得对 menuitem(复选标记)的引用?
  • 我编辑了我的问题,我确实在片段中膨胀(从活动中删除它)但我仍然无法从 SearchView 获得参考,NPE 总是
  • 不要在“onPrepareOptionsMenu”中调用它。在“onCreateOptionsMenu”中调用它
【解决方案2】:

已解决:

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

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

【讨论】:

  • 你能不能解释得清楚一点,这个一点都不清楚。
  • 只需使用 SearchView.OnQueryTextListener 扩展类并覆盖这 2 个方法(你必须这样做)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
相关资源
最近更新 更多