2017-05-09 1 views
1

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?

+0

Pourquoi ne pas vous gonflez votre menu à partir de fragment? –

+0

@IvanMilisavljevic parce que pour deux onglets, les éléments du menu étaient identiques et seulement pour le troisième, c'était différent. –

+0

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. –

Répondre

0

Ce n'est pas si difficile. SearchView est une vue, vous pouvez donc utiliser la vue de classe et ses propriétés et fonctions dans searchView. Voici la documentation: https://developer.android.com/reference/android/view/View.html Recherchez la fonction setVisibility.

Si vous recherchez l'élément de menu et non le serachview lui-même, vous devez mettre le setVisible (false) dans votre void public sur le menu PréparerOptions (menu Menu); funciton.

+0

contactsSearchMenu.setVisible (false); ceci est défini pour tab1 et tab2 –

+0

Dans ce cas, placez le code dans cette fonction: onPrepareOptionsMenu (menu Menu); faites-le et dites – mmelotti

+0

toujours le même résultat –

0

Vous pouvez surveiller les changements de page et le menu invalidateOptions appeler chaque fois qu'il ya un changement dans un 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); 
     } 
+0

Comment définir des balises pour des fragments dans viewpager? –

+0

Vous utilisez donc ViewPager? –

+0

Oui, vous pouvez voir ma disposition d'activité –