Mon application dispose de 3 onglets et les éléments de menu de tab3 sont différents. Donc ce que j'ai fait est que j'ai gonflé les éléments de menu dans l'activité et basé sur le fragment menuitems visibilty est défini.Comment masquer la vue de recherche dans la barre d'action
Code d'activité:
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 (Code Fragment):
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);
}
code Tab2 même comme Tab1
code Tab3:
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);
}
}
}
mise en page d'activité:
<?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>
Mais le problème est seul élément de menu SearchView est visible pour les trois onglets. Comment masquer l'élément de menu searchview pour tab1 et tab2?
Pourquoi ne pas vous gonflez votre menu à partir de fragment? –
@IvanMilisavljevic parce que pour deux onglets, les éléments du menu étaient identiques et seulement pour le troisième, c'était différent. –
Le même code fonctionne avec la dernière bibliothèque android. Je pense que c'était un bug dans la version précédente. –