Reputation: 5302
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
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
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