J'essaie d'implémenter cette barre inférieure qui contient un article avec une taille plus grande et une forme différente des autres.
Existe-t-il un moyen non hacky pour y parvenir en utilisant le composant natif de navigation inférieure? Je suppose que non, car cela ne semble pas conforme aux spécifications Material Design.
Sinon, quelle serait la meilleure approche à suivre? Je ne vois que 2 façons d'y parvenir, mais aucune ne me semble fiable.
[~ # ~] modifier [~ # ~]
C'est ce que j'ai obtenu en augmentant la taille de l'icône comme suggéré par Harshit et fmaccaroni.
Lorsque l'élément n'est pas sélectionné:
Lorsque l'élément est sélectionné:
Pro: l'icône est plus grande que les autres
Inconvénients: Il est toujours contenu à l'intérieur de la barre inférieure. En outre, il n'est pas centré verticalement lorsqu'il est sélectionné
<Android.support.design.widget.BottomNavigationView
Android:id="@+id/navigation"
Android:layout_width="match_parent"
Android:layout_height="56dp"
Android:layout_alignParentBottom="true"
Android:background="?android:attr/windowBackground"
app:itemIconTint="@color/colorPrimary"
app:itemTextColor="@Android:color/black"
app:menu="@menu/navigation"
Android:clipChildren="false">
<Android.support.design.widget.FloatingActionButton
Android:id="@+id/fab"
Android:layout_width="56dp"
Android:layout_height="56dp"
Android:layout_gravity="center"
Android:layout_marginBottom="8dp"
app:elevation="6dp"
Android:scaleType="center" />
</Android.support.design.widget.BottomNavigationView>
ajoutez également Android: clipChildren = "false" à la disposition racine
MODIFIER:
Cette réponse a été écrite avant la mise à jour de Material 2018. Probablement plus le chemin à parcourir. Reportez-vous à la réponse de DPalagi pour des informations à jour.
Après quelques recherches, je suis tombé sur cette bibliothèque . Ils n'ont pas fourni ce que je cherchais, mais ils ont implémenté ce comportement dans l'un de leurs échantillons, ce qui était assez proche de ce dont j'avais besoin.
Voici ce que j'ai obtenu en réutilisant leur idée ( testée uniquement sur l'API 23 ):
<blockquote class="imgur-embed-pub" lang="en" data-id="a/0Oypk"><a href="//imgur.com/0Oypk"></a></blockquote><script async src="//s.imgur.com/min/embed.js" charset="utf-8"></script>
Il a l'air décent, mais je n'aime pas l'implémentation car la navigation du bas est maintenant divisée entre deux composants.
L'idée est de créer un élément vide au milieu de la barre inférieure et d'ajouter un bouton d'action flottant au-dessus pour créer l'illusion qu'il fait partie de la barre inférieure.
Voici la disposition de ma barre inférieure et du bouton de navigation flottant:
<com.ittianyu.bottomnavigationviewex.BottomNavigationViewEx
Android:id="@+id/navigation"
Android:layout_width="match_parent"
Android:layout_height="56dp"
Android:layout_gravity="bottom"
app:elevation="0dp"
app:itemIconTint="@drawable/menu_item_selector"
app:itemTextColor="@drawable/menu_item_selector"
app:layout_constraintBottom_toBottomOf="parent"
app:menu="@menu/navigation_items" />
<Android.support.design.widget.FloatingActionButton
Android:id="@+id/fab"
Android:layout_width="70dp"
Android:layout_height="70dp"
Android:layout_marginEnd="8dp"
Android:layout_marginStart="8dp"
Android:focusable="true"
app:backgroundTint="@color/white"
app:borderWidth="0dp"
app:elevation="0dp"
app:fabSize="mini"
app:layout_constraintBottom_toBottomOf="@id/navigation"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:srcCompat="@drawable/camera_icon" />
Éléments de la barre de navigation:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools">
<item
Android:id="@+id/action_around_me"
Android:icon="@drawable/ic_bottombar_around_me"
tools:ignore="MenuTitle" />
<item
Android:id="@+id/action_my_projects"
Android:icon="@drawable/ic_bottombar_projects"
tools:ignore="MenuTitle" />
<!-- Here is the trick -->
<item
Android:id="@+id/empty"
Android:enabled="false"
tools:ignore="MenuTitle" />
<item
Android:id="@+id/action_notifications"
Android:icon="@drawable/ic_bottombar_notification"
tools:ignore="MenuTitle" />
<item
Android:id="@+id/action_settings"
Android:icon="@drawable/ic_bottombar_settings"
tools:ignore="MenuTitle" />
</menu>
Chaque fois que je clique sur le bouton FAB, je désactive la barre inférieure:
private void disableBottomBar() {
Menu menu = navigationBar.getMenu();
for (int i = 0; i < menu.size(); i++) {
// The third item is a an empty item so we do not do anything on it
if (i != 2) {
menu.getItem(i).setCheckable(false);
}
}
}
Même chose avec setCheckable(true)
quand une icône de la barre inférieure est cliquée.
J'espère que cela t'aides.
Depuis la dernière mise à jour Material (2018), il est possible de le faire avec des éléments d'interface utilisateur natifs:
BottomAppBar
avec app:fabAttached
attributFloatingActionButton
avec app:layout_anchor
concernant le BottomAppBarapp:fabAlignmentMode
Vous pouvez vous référer à ce grand article Medium pour plus de nouveaux éléments matériels et plus de détails sur celui-ci.
J'espère que cela vous aide!
La taille des icônes dans la navigation de la barre inférieure peut être modifiée par programme en
BottomNavigationView bottomNavigationView = (BottomNavigationView)
activity.findViewById(R.id.bottom_navigation_view);
BottomNavigationMenuView menuView = (BottomNavigationMenuView)
bottomNavigationView.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
final View iconView =
menuView.getChildAt(i).findViewById(Android.support.design.R.id.icon);
final ViewGroup.LayoutParams layoutParams = iconView.getLayoutParams();
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
// set your height here
layoutParams.height = (int)
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32, displayMetrics);
// set your width here
layoutParams.width = (int)
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32, displayMetrics);
iconView.setLayoutParams(layoutParams);
}
J'ai fait quelque chose comme ça pour changer la taille des éléments de navigation de la barre inférieure comme vous le souhaitez.
Et voici ce que vous pouvez faire:
Prenez une image de grande taille de la même image que vous souhaitez afficher plus grande lorsque vous cliquez dessus et stockez-la dans ce dossier dessinable.
Ensuite, appliquez lorsque vous cliquez sur la barre de navigation inférieure de cet élément particulier, puis définissez l'image précédente plus petite avec l'image plus grande.
Et vous pouvez voir cette bibliothèque utiliser cette bibliothèque pour résoudre votre problème.
En prenant this comme référence, vous pouvez itérer pour chaque enfant de votre BottomNavigationView et modifier la taille de l'élément spécifié:
BottomNavigationView bottomNavigationView = (BottomNavigationView) activity.findViewById(R.id.bottom_navigation_view);
BottomNavigationMenuView menuView = (BottomNavigationMenuView) bottomNavigationView.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
final View iconView = menuView.getChildAt(i).findViewById(Android.support.design.R.id.icon);
final ViewGroup.LayoutParams layoutParams = iconView.getLayoutParams();
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
// If it is my special menu item change the size, otherwise take other size
if (i == 2){
// set your height here
layoutParams.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 60, displayMetrics);
// set your width here
layoutParams.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 60, displayMetrics);
}
else {
// set your height here
layoutParams.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32, displayMetrics);
// set your width here
layoutParams.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32, displayMetrics);
}
iconView.setLayoutParams(layoutParams);
}
la manière la plus simple consiste à utiliser setScaleX et setScaleY. par exemple:
final View iconView =
menuView.getChildAt(2).findViewById(Android.support.design.R.id.icon);
iconView.setScaleY(1.5f);
iconView.setScaleX(1.5f);