Search code examples
androidandroid-fragmentsandroid-toolbarandroid-menu

SearchView is not hiding from Toolbar in different Fragments


I have implemented SearchView inside one of a Fragment of Tablayout. It is working fine(show/hide) when switching between tablayout fragments.

My issue is that I have a HomeActivity in which I have implemented NavigationDrawer in one of a Fragment I have added TabLayout and in one of TabLayout Fragment I have added SearchView. Issue occurs when I am switching from Fragment which has a SearchView to Fragment from NavDrawer. Searchview remains up there in other fragments too and when I switch back to that fragment in which I have added searchView then that fragment add one more searchview over Toolbar.

Here's my code from Fragment which as a 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 code in which I don't want SearchView

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

I haven't added any code related to menu in activity.

First run Image with searchView enter image description here

Image after switching to different fragment from navMenu enter image description here

Image again switching to fragment which has menu enter image description here


Solution

  • It's a bit hacky but I solved it by setting setHasOptionsMenu to true and clearing the Menu in onCreateOptionsMenu via

    public void onCreateOptionsMenu (Menu menu, MenuInflater inflater){
       menu.clear()
    }