SearchView 没有隐藏在不同片段中的工具栏中

SearchView is not hiding from Toolbar in different Fragments

我已经在 TablayoutFragment 之一中实现了 SearchView。在 tablayout 片段之间切换时工作正常(show/hide)。

我的问题是我有一个 HomeActivity,其中我在其中一个 Fragment 中实现了 NavigationDrawer 我添加了 TabLayout 并且在 TabLayout Fragment我加了SearchView。当我从具有 SearchViewFragment 切换到来自 NavDrawer 的 Fragment 时,会出现问题。 Searchview 也保留在其他片段中,当我切换回我添加了 searchView 的片段时,该片段在 Toolbar.

上再添加一个 searchview

这是我的片段代码,作为 SearchView

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        setHasOptionsMenu(true);
        ....
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_search, menu);
        LogUtils.LOGI("menu added", "menu");
        // Associate searchable configuration with the SearchView
        //SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        //SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
        //searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

        final MenuItem item = menu.findItem(R.id.search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String query) {
                LogUtils.LOGI("Search filter", query);
                final ArrayList<EventModel> filteredModelList = filter(allEventseventsArrayList, query);
                allEventsListAdapter.animateTo(filteredModelList);
                eventbriteListRecyclerView.scrollToPosition(0);
                return true;
            }
        });


        searchView.setOnSearchClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LogUtils.LOGI("Search", "Search Expands");
                titleIconImageView.setVisibility(View.GONE);
            }
        });

        searchView.setOnCloseListener(new SearchView.OnCloseListener() {
            @Override
            public boolean onClose() {
                LogUtils.LOGI("Search", "Search Collapse");
                titleIconImageView.setVisibility(View.VISIBLE);
                return false;
            }
        });

        MenuItemCompat.setOnActionExpandListener(item,
                new MenuItemCompat.OnActionExpandListener() {
                    @Override
                    public boolean onMenuItemActionExpand(MenuItem menuItem) {
                        // Return true to allow the action view to expand
                        titleIconImageView.setVisibility(View.GONE);
                        LogUtils.LOGI("Menu", "Menu Expands");
                        return true;
                    }

                    @Override
                    public boolean onMenuItemActionCollapse(MenuItem menuItem) {
                        // When the action view is collapsed, reset the query
                        LogUtils.LOGI("Menu", "Menu Collapse");
                        titleIconImageView.setVisibility(View.VISIBLE);
                        // Return true to allow the action view to collapse
                        return true;
                    }
                });

        super.onCreateOptionsMenu(menu, inflater);
    }

Fragment 我不想要的代码 SearchView

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        setHasOptionsMenu(false);
        ....
}

我没有在activity中添加任何与菜单相关的代码。

第一个 运行 带有 searchView 的图片

从 navMenu 切换到不同片段后的图像

图像再次切换到有菜单的片段

这有点老套,但我通过将 setHasOptionsMenu 设置为 true 并通过

清除 onCreateOptionsMenu 中的菜单解决了这个问题
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater){
   menu.clear()
}