Zohra Khan
Zohra Khan

Reputation: 5302

How to hide search view in action bar

My app has 3 tabs and tab3 menu items are different. So what I have done is I have inflated menu items in activity and based on the fragment menuitems visibilty is set.

Activity Code:

public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu_home_page, menu);
        return true;
    }

Menu_home_page.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
<item
    android:id="@+id/menu_plan_your_day"
    android:icon="@drawable/ic_settings_white_18dp"
    android:title="@string/action_notify"
    android:visible="false"
    app:showAsAction="always" />
<item
    android:id="@+id/menu_notification"
    android:icon="@drawable/ic_notifications_white_18dp"
    android:title="@string/action_notify"
    android:visible="false"
    app:showAsAction="always" />
<item
    android:id="@+id/menu_search"
    android:icon="@android:drawable/ic_menu_search"
    android:title="@string/menu_search"
    android:visible="false"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always" />


</menu>

Tab1 (Fragment Code):

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }
public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
       getActivity().invalidateOptionsMenu();
}

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        final MenuItem contactsSearchMenu = menu.findItem(R.id.menu_search);
        final MenuItem planYourDayMenu = menu.findItem(R.id.menu_plan_your_day);
        final MenuItem notificationMenu = menu.findItem(R.id.menu_notification);
        contactsSearchMenu.setVisible(false);
        planYourDayMenu.setVisible(true);
        notificationMenu.setVisible(true);

    }

Tab2 code same like Tab1

Tab3 Code:

public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        if (menu != null) {
            final MenuItem contactsSearchMenu = menu.findItem(R.id.menu_search);
            final MenuItem planYourDayMenu = menu.findItem(R.id.menu_plan_your_day);
            final MenuItem notificationMenu = menu.findItem(R.id.menu_notification);
            contactsSearchMenu.setVisible(true);
            planYourDayMenu.setVisible(false);
            notificationMenu.setVisible(false);
        }

    }


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    // Locate the search item
    MenuItem searchItem = menu.findItem(R.id.menu_search);


    // In version 3.0 and later, sets up and configures the ActionBar SearchView
    if (Utils.hasHoneycomb()) {

        // Retrieves the system search manager service
        final SearchManager searchManager =
                (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
        final SearchView searchView = (SearchView) searchItem.getActionView();
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getActivity().getComponentName()));


        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String queryText) {

                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                String newFilter = !TextUtils.isEmpty(newText) ? newText : null;
                if (mSearchTerm == null && newFilter == null) {
                    return true;
                }


                if (mSearchTerm != null && mSearchTerm.equals(newFilter)) {
                    return true;
                }

                mSearchTerm = newFilter;

                mSearchQueryChanged = true;
                getLoaderManager().restartLoader(
                        ContactsQuery.QUERY_ID, null, ContactsListFragment.this);
                return true;
            }
        });

        if (Utils.hasICS()) {
            MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
                @Override
                public boolean onMenuItemActionExpand(MenuItem menuItem) {

                    return true;
                }

                @Override
                public boolean onMenuItemActionCollapse(MenuItem menuItem) {

                    if (!TextUtils.isEmpty(mSearchTerm)) {
                        onSelectionCleared();
                    }
                    mSearchTerm = null;
                    getLoaderManager().restartLoader(
                            ContactsQuery.QUERY_ID, null, ContactsListFragment.this);
                    return true;
                }
            });

        }

        if (mSearchTerm != null) {
            final String savedSearchTerm = mSearchTerm;

            if (Utils.hasICS()) {
                searchItem.expandActionView();
            }
            searchView.setQuery(savedSearchTerm, false);
        }
    }
}

Activity layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <android.support.design.widget.AppBarLayout
        android:id="@+id/HomePageAppbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/appbar_padding_top"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay"></android.support.v7.widget.Toolbar>

        <android.support.design.widget.TabLayout
            android:id="@+id/HomePageTab"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            app:tabMode="fixed" />
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/HomePageViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"></android.support.v4.view.ViewPager>


</LinearLayout>

But the problem is only searchview menu item is visible for all three tabs. How to hide the searchview menu item for tab1 and tab2?

Upvotes: 1

Views: 3279

Answers (2)

mmelotti
mmelotti

Reputation: 346

It's not that hard. The searchView is a View, so you can use the Class View and it's properties and functions in searchView.

Here is the documentation. Look for the setVisibility function.

If you are looking for the menu item and not the searchView itself, you have to put the setVisible(false) in your public void onPrepareOptionsMenu(Menu menu) function.

Upvotes: 0

Ivan Milisavljevic
Ivan Milisavljevic

Reputation: 2068

You can monitor for page changes and call invalidateOptions menu every time there is a change in a ViewPager

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

                }

                @Override
                public void onPageSelected(int position) {
                    invalidateOptionsMenu();
                }

                @Override
                public void onPageScrollStateChanged(int state) {

                }
            });
        }


        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {

            if (viewPager.getCurrentItem() == 1 || viewPager.getCurrentItem() == 2) {
                contactsSearchMenu.setVisible(false);
            } else {
                contactsSearchMenu.setVisible(false);
            }

            return super.onPrepareOptionsMenu(menu);
        }

Upvotes: 1

Related Questions