2016-12-29 3 views
1

Comme j'ai aimé la conception de BottomNavigationView j'ai décidé d'implémenter un nouveau menu pour mon application avec elle, au lieu de simplement utiliser de simples boutons. J'ai pris le this comme ligne directrice.BottomNavigationView - Comment décocher tous les éléments MenuItems et garder les titres affichés?

Selon l » documentationBottomNavigationView, son but est de

provide quick navigation between top-level views of an app. It is primarily designed for use on mobile.

Dans mon cas, je veux juste chaque MenuItem pour lancer une activité, mais par défaut il y a toujours un MenuItem sélectionné:

enter image description here

J'ai essayé de définir la couleur au blanc avec:

app:itemIconTint="@color/white" 
app:itemTextColor="@color/white" 

encore, visiblement sélectionné MenuItem est différent des autres (la taille du titre plus), ce qui me tracasse encore:

enter image description here

Je suis venu avec l'idée de placer un cache MenuItem pour sélectionner comme:

<item 
android:id="@+id/uncheckedItem" 
android:title="" /> 

et faire son point de vue GONE:

bottomNavigationView.getMenu().findItem(R.id.uncheckedItem).setChecked(true); 
bottomNavigationView.findViewById(R.id.uncheckedItem).setVisibility(View.GONE); 

Cela rend tous MenuItems sans contrôle, mais par défaut BottomNavigationView est Titres hidding, car il a plus de 3 MenuItems à afficher, même si le quatrième MenuItem est-régler à GONE:

enter image description here

Alors mes restes de question , est-il absent/pirater pour désélectionner tous les MenuItems et garder ses titres affichés?

Répondre

2

J'ai trouvé ma propre solution fusionnant mes progrès avec this post.

Étapes:

  1. Mise à jour proguard-rules.pro et synchronisation BUILD
  2. Créer Helper pour désactiver le mode BottomNavigationView Maj
  3. Créer un élément pour cacher le menu.xml
  4. Gonfler BottomNavigationView
  5. Set Point à cacher comme Vérifié GONE
  6. Utilisez Aide pour désactiver Shifting mode

Sortie:

enter image description here

Code de travail:

proguard-rules.pro:

-keepclassmembers class android.support.design.internal.BottomNavigationMenuView { 
    boolean mShiftingMode; 
} 

BottomNavigationShiftHelper.java:

public class BottomNavigationShiftHelper { 

    private final static String TAG = "DEBUG_BOTTOM_NAV_UTIL"; 

    public static void disableShiftMode(BottomNavigationView view) { 
     BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0); 
     try { 
      Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode"); 
      shiftingMode.setAccessible(true); 
      shiftingMode.setBoolean(menuView, false); 
      shiftingMode.setAccessible(false); 
      for (int i = 0; i < menuView.getChildCount(); i++) { 
       BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i); 
       item.setShiftingMode(false); 
       // set once again checked value, so view will be updated 
       item.setChecked(item.getItemData().isChecked()); 
      } 
     } catch (NoSuchFieldException e) { 
      Log.d(TAG, "Unable to get shift mode field"); 
     } catch (IllegalAccessException e) { 
      Log.d(TAG, "Unable to change value of shift mode"); 
     } 
    } 
} 

Activité Sample.java:

private void loadNavigationBar() { 
     BottomNavigationView bottomNavigationView = (BottomNavigationView) 
       findViewById(R.id.navigation_bar); 

     bottomNavigationView.getMenu().findItem(R.id.uncheckedItem).setChecked(true); 
     bottomNavigationView.findViewById(R.id.uncheckedItem).setVisibility(View.GONE); 

     BottomNavigationViewUtils.disableShiftMode(bottomNavigationView); 

     bottomNavigationView.setOnNavigationItemSelectedListener(
       new BottomNavigationView.OnNavigationItemSelectedListener() { 
        @Override 
        public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
         switch (item.getItemId()) { 
          case R.id.newList: 
           //Do The Math 
           break; 
          case R.id.loadList: 
           //Do The Math 
           break; 
          case R.id.settings: 
           //Do The Math 
           break; 
         } 
         return false; 
        } 
       }); 
    } 

Bott omNavigationMenu.xml:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item 
     android:id="@+id/newList" 
     android:enabled="true" 
     android:icon="@drawable/new_list" 
     android:title="@string/common.button.list.new" 
     app:showAsAction="withText" /> 
    <item 
     android:id="@+id/loadList" 
     android:enabled="true" 
     android:icon="@drawable/load" 
     android:title="@string/common.button.list.load" 
     app:showAsAction="withText" /> 
    <item 
     android:id="@+id/settings" 
     android:enabled="true" 
     android:icon="@drawable/settings" 
     android:title="@string/common.label.settings" 
     app:showAsAction="withText" /> 
    <item 
     android:id="@+id/uncheckedItem" 
     android:title="" /> 
</menu> 

BottomNavigationComponent (à l'intérieur Activity.xml):

<android.support.design.widget.BottomNavigationView 
    android:id="@+id/navigation_bar" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    app:itemIconTint="@color/white" 
    app:itemTextColor="@color/white" 
    android:background="@drawable/BottomNavigationMenu.xml" 
    app:menu="@menu/supercart_bottom_navigation" /> 
+0

cela fonctionne, mais maintenant mon point de vue de la navigation en bas n'a pas toute la largeur ... pouvez-vous s'il vous plaît aider – TheGreat004

+0

je suis les suivantes question, https://github.com/ittianyu/BottomNavigationViewEx/issues/25 – TheGreat004

+1

J'ai 5 éléments et si j'ajoute un élément vide, je reçois cette erreur: Le nombre maximum d'éléments pris en charge par BottomNavigationView est 5 – Kusan

1

Votre solution semble changer l'espace entre les éléments

Il est ma solution:

"Il suffit de définir la couleur du même cliqué que la couleur de non-cliqué."

par exemple:

private void changeMenuItemCheckedStateColor(BottomNavigationView bottomNavigationView, String checkedColorHex, String uncheckedColorHex) { 
    int checkedColor = Color.parseColor(checkedColorHex); 
    int uncheckedColor = Color.parseColor(uncheckedColorHex); 

    int[][] states = new int[][] { 
      new int[] {-android.R.attr.state_checked}, // unchecked 
      new int[] {android.R.attr.state_checked}, // checked 

    }; 

    int[] colors = new int[] { 
      uncheckedColor, 
      checkedColor 
    }; 

    ColorStateList colorStateList = new ColorStateList(states, colors); 

    bottomNavigationView.setItemTextColor(colorStateList); 
    bottomNavigationView.setItemIconTintList(colorStateList); 

} 

si vous souhaitez décocher tous les éléments, vous pouvez

changeMenuItemCheckedStateColor(mBottomNavigationView, "#999999", "#999999"); 

si vous souhaitez restaurer le réglage des couleurs, vous pouvez

changeMenuItemCheckedStateColor(mBottomNavigationView, "FF743A", "999999"); 
3

Merci pour votre idée. Je l'ai implémenté dans ma bibliothèque. J'ai une meilleure façon de le faire en réfléchissant. Donc, ça ne montrera pas d'espace.

Si vous avez intérêt. Cliquez ici: https://github.com/ittianyu/BottomNavigationViewEx

private void initBottomViewAndLoadFragments(final BottomNavigationViewEx bnve) { 
    bnve.enableAnimation(false); 
    bnve.enableShiftingMode(false); 
    bnve.enableItemShiftingMode(false); 

    // use the unchecked color for first item 
    bnve.setIconTintList(0, getResources().getColorStateList(R.color.bnv_unchecked_black)); 
    bnve.setTextTintList(0, getResources().getColorStateList(R.color.bnv_unchecked_black)); 

    bnve.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 

     private boolean firstClick = true; 
     private int lastItemId = -1; 

     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      // restore the color when click 
      if (firstClick) { 
       firstClick = false; 
       bnve.setIconTintList(0, getResources().getColorStateList(R.color.selector_bnv)); 
       bnve.setTextTintList(0, getResources().getColorStateList(R.color.selector_bnv)); 
      } 

      if (firstClick || lastItemId == -1 || lastItemId != item.getItemId()) { 
       lastItemId = item.getItemId(); 
      } else { 
       return false; 
      } 

      // do stuff 
      return fillContent(item.getItemId()); 
     } 
    }); 
} 

- res/couleur/selector_bnv.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:color="@color/bnv_checked_white" android:state_checked="true" /> 
    <item android:color="@color/bnv_unchecked_black" /> 
</selector> 

- res/valeurs/couleurs.xml

<color name="bnv_checked_white">@android:color/white</color> 
<color name="bnv_unchecked_black">@android:color/black</color> 
+0

Bon travail! S'il vous plaît, écrivez comment faire la première fois décochée. Vous n'avez pas trouvé de code pour cela dans votre repo. – oxied

+0

MISE À JOUR: trouvé dans son repo: https://github.com/ittianyu/BottomNavigationViewEx/blob/master/app/src/main/java/com/ittianyu/bottomnavigationviewexsample/features/style/StyleActivity.java#L152 – oxied

+0

Aussi mis à jour son message avec un exemple de code direct. – oxied

0

Ceci est la même que la réponse acceptée sauf que j'ai changé deux lignes de code marquées ci-dessous. Lors de la lecture en boucle de BottomNavigationItemViews, je mets toujours la valeur false à false et je mets aussi checkable à false. Cela empêche les éléments de menu de changer de taille. Vous avez encore besoin de cette règle PROGUARD:

 -keepclassmembers class android.support.design.internal.BottomNavigationMenuView { 
     boolean mShiftingMode; 
     } 

Code Mise à jour:

static void removeShiftMode(BottomNavigationView view) 
    { 
     BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0); 
     try 
     { 
      Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode"); 
      shiftingMode.setAccessible(true); 
      shiftingMode.setBoolean(menuView, false); 
      shiftingMode.setAccessible(false); 
      for (int i = 0; i < menuView.getChildCount(); i++) 
      { 
       BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i); 
       item.setShiftingMode(false); 
       item.setChecked(false); // <--- This line changed 
       item.setCheckable(false); // <-- This line was added 
      } 
     } 
     catch (NoSuchFieldException e) 
     { 
      Log.e("ERROR NO SUCH FIELD", "Unable to get shift mode field"); 
     } 
     catch (IllegalAccessException e) 
     { 
      Log.e("ERROR ILLEGAL ALG", "Unable to change value of shift mode"); 
     } 

    }