Skip to content

Commit a798a82

Browse files
imhappipekingme
authored andcommitted
[NavigationRail] Add attributes for expanded active indicator padding
PiperOrigin-RevId: 715573480
1 parent bc2fdea commit a798a82

File tree

6 files changed

+119
-19
lines changed

6 files changed

+119
-19
lines changed

docs/components/NavigationRail.md

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -388,17 +388,21 @@ for more attributes.
388388

389389
#### Active indicator attributes
390390

391-
**Element** | **Attribute** | **Related methods** | **Default value**
392-
--------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------------------- | -----------------
393-
**Color** | `android:color` | `setItemActiveIndicatorColor`<br/>`getItemActiveIndicatorColor` | `?attr/colorSecondaryContainer`
394-
**Width** | `android:width` | `setItemActiveIndicatorWidth`<br/>`getItemActiveIndicatorWidth` | `56dp`
395-
**Height** | `android:height` | `setItemActiveIndicatorHeight`<br/>`getItemActiveIndicatorHeight` | `32dp`
396-
**Shape** | `app:shapeAppearance` | `setItemActiveIndicatorShapeAppearance`<br/>`getItemActiveIndicatorShapeAppearance` | `50% rounded`
397-
**Margin horizontal** | `app:marginHorizontal` | `setItemActiveIndicatorMarginHorizontal`<br/>`getItemActiveIndicatorMarginHorizontal` | `4dp`
398-
**Padding between indicator and label** | `app:activeIndicatorLabelPadding` | `setActiveIndicatorLabelPadding` <br/> `getActiveIndicatorLabelPadding` | `4dp`
399-
**Expanded Width** | `expandedWidth` | `setItemExpandedActiveIndicatorWidth`<br/>`getItemExpandedActiveIndicatorWidth` | `HUG`
400-
**Expanded Height** | `expandedHeight` | `setItemExpandedActiveIndicatorHeight`<br/>`getItemExpandedActiveIndicatorHeight` | `56dp`
401-
**Expanded Margin horizontal** | `app:expandedMarginHorizontal` | `setItemExpandedActiveIndicatorMarginHorizontal`<br/>`getItemExpandedActiveIndicatorMarginHorizontal` | `20dp`
391+
**Element** | **Attribute** | **Related methods** | **Default value**
392+
--------------------------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------- | -----------------
393+
**Color** | `android:color` | `setItemActiveIndicatorColor`<br/>`getItemActiveIndicatorColor` | `?attr/colorSecondaryContainer`
394+
**Width** | `android:width` | `setItemActiveIndicatorWidth`<br/>`getItemActiveIndicatorWidth` | `56dp`
395+
**Height** | `android:height` | `setItemActiveIndicatorHeight`<br/>`getItemActiveIndicatorHeight` | `32dp`
396+
**Shape** | `app:shapeAppearance` | `setItemActiveIndicatorShapeAppearance`<br/>`getItemActiveIndicatorShapeAppearance` | `50% rounded`
397+
**Margin horizontal** | `app:marginHorizontal` | `setItemActiveIndicatorMarginHorizontal`<br/>`getItemActiveIndicatorMarginHorizontal` | `4dp`
398+
**Padding between indicator and label** | `app:activeIndicatorLabelPadding` | `setActiveIndicatorLabelPadding` <br/> `getActiveIndicatorLabelPadding` | `4dp`
399+
**Expanded Width** | `expandedWidth` | `setItemExpandedActiveIndicatorWidth`<br/>`getItemExpandedActiveIndicatorWidth` | `HUG`
400+
**Expanded Height** | `expandedHeight` | `setItemExpandedActiveIndicatorHeight`<br/>`getItemExpandedActiveIndicatorHeight` | `56dp`
401+
**Expanded Margin horizontal** | `app:expandedMarginHorizontal` | `setItemExpandedActiveIndicatorMarginHorizontal`<br/>`getItemExpandedActiveIndicatorMarginHorizontal` | `20dp`
402+
**Expanded Start Padding** | `app:expandedActiveIndicatorPaddingStart` | `setItemExpandedActiveIndicatorPadding` | `16dp`
403+
**Expanded End Padding** | `app:expandedActiveIndicatorPaddingEnd` | `setItemExpandedActiveIndicatorPadding` | `16dp`
404+
**Expanded Top Padding** | `app:expandedActiveIndicatorPaddingTop` | `setItemExpandedActiveIndicatorPadding` | `16dp`
405+
**Expanded Start Padding** | `app:expandedActiveIndicatorPaddingBottom` | `setItemExpandedActiveIndicatorPadding` | `16dp`
402406

403407
**Note:** The expanded active indicator refers to the active indicator that
404408
expands to wrap the content of the Navigation Rail item when the

lib/java/com/google/android/material/navigation/NavigationBarItemView.java

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import android.animation.ValueAnimator.AnimatorUpdateListener;
3131
import android.content.Context;
3232
import android.content.res.ColorStateList;
33+
import android.graphics.Rect;
3334
import android.graphics.Typeface;
3435
import android.graphics.drawable.Drawable;
3536
import android.graphics.drawable.RippleDrawable;
@@ -166,6 +167,7 @@ public abstract class NavigationBarItemView extends FrameLayout
166167
private boolean onlyShowWhenExpanded = false;
167168
private boolean measurePaddingFromBaseline = false;
168169
private boolean scaleLabelSizeWithFont = false;
170+
private Rect itemActiveIndicatorExpandedPadding = new Rect();
169171

170172
public NavigationBarItemView(@NonNull Context context) {
171173
super(context);
@@ -390,7 +392,10 @@ private void addDefaultExpandedLabelGroupViews() {
390392
}
391393

392394
private void updateItemIconGravity() {
393-
int sideMargin = 0;
395+
int leftMargin = 0;
396+
int rightMargin = 0;
397+
int topMargin = 0;
398+
int bottomMargin = 0;
394399
int sidePadding = 0;
395400
badgeFixedEdge = BadgeDrawable.BADGE_FIXED_EDGE_START;
396401
int verticalLabelGroupVisibility = VISIBLE;
@@ -400,9 +405,10 @@ private void updateItemIconGravity() {
400405
if (expandedLabelGroup.getParent() == null) {
401406
addDefaultExpandedLabelGroupViews();
402407
}
403-
sideMargin =
404-
getResources()
405-
.getDimensionPixelSize(R.dimen.m3_navigation_item_leading_trailing_space);
408+
leftMargin = itemActiveIndicatorExpandedPadding.left;
409+
rightMargin = itemActiveIndicatorExpandedPadding.right;
410+
topMargin = itemActiveIndicatorExpandedPadding.top;
411+
bottomMargin = itemActiveIndicatorExpandedPadding.bottom;
406412
badgeFixedEdge = BadgeDrawable.BADGE_FIXED_EDGE_END;
407413
sidePadding = activeIndicatorExpandedMarginHorizontal;
408414
verticalLabelGroupVisibility = GONE;
@@ -415,8 +421,10 @@ private void updateItemIconGravity() {
415421
contentContainerLp.gravity = itemGravity;
416422
FrameLayout.LayoutParams innerContentLp =
417423
(LayoutParams) innerContentContainer.getLayoutParams();
418-
innerContentLp.leftMargin = sideMargin;
419-
innerContentLp.rightMargin = sideMargin;
424+
innerContentLp.leftMargin = leftMargin;
425+
innerContentLp.rightMargin = rightMargin;
426+
innerContentLp.topMargin = topMargin;
427+
innerContentLp.bottomMargin = bottomMargin;
420428

421429
setPadding(sidePadding, 0, sidePadding, 0);
422430
updateActiveIndicatorLayoutParams(getWidth());
@@ -580,8 +588,8 @@ private void setLayoutConfigurationIconAndLabel(
580588
itemGravity);
581589
setViewMarginAndGravity(
582590
innerContentContainer,
583-
0,
584-
0,
591+
itemIconGravity == ITEM_ICON_GRAVITY_TOP ? 0 : itemActiveIndicatorExpandedPadding.top,
592+
itemIconGravity == ITEM_ICON_GRAVITY_TOP ? 0 : itemActiveIndicatorExpandedPadding.bottom,
585593
itemIconGravity == ITEM_ICON_GRAVITY_TOP
586594
? Gravity.CENTER
587595
: Gravity.START | Gravity.CENTER_VERTICAL);
@@ -1167,6 +1175,15 @@ public void setActiveIndicatorExpandedHeight(int height) {
11671175
updateActiveIndicatorLayoutParams(getWidth());
11681176
}
11691177

1178+
/**
1179+
* Set the padding of the active indicator when it is expanded to wrap its content.
1180+
*
1181+
* @param itemActiveIndicatorExpandedPadding the Rect containing the padding information
1182+
*/
1183+
public void setActiveIndicatorExpandedPadding(@NonNull Rect itemActiveIndicatorExpandedPadding) {
1184+
this.itemActiveIndicatorExpandedPadding = itemActiveIndicatorExpandedPadding;
1185+
}
1186+
11701187
/**
11711188
* Update the active indicators width and height for the available width and label visibility
11721189
* mode.

lib/java/com/google/android/material/navigation/NavigationBarMenuView.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import android.annotation.SuppressLint;
2525
import android.content.Context;
2626
import android.content.res.ColorStateList;
27+
import android.graphics.Rect;
2728
import android.graphics.drawable.Drawable;
2829
import androidx.appcompat.content.res.AppCompatResources;
2930
import androidx.appcompat.view.menu.MenuBuilder;
@@ -132,6 +133,7 @@ public abstract class NavigationBarMenuView extends ViewGroup implements MenuVie
132133
private static final int DEFAULT_COLLAPSED_MAX_COUNT = 7;
133134
private int collapsedMaxItemCount = DEFAULT_COLLAPSED_MAX_COUNT;
134135
private boolean dividersEnabled = false;
136+
private final Rect itemActiveIndicatorExpandedPadding = new Rect();
135137

136138
public NavigationBarMenuView(@NonNull Context context) {
137139
super(context);
@@ -804,6 +806,30 @@ public void setItemActiveIndicatorExpandedMarginHorizontal(@Px int marginHorizon
804806
}
805807
}
806808

809+
/**
810+
* Set the padding of the expanded active indicator wrapping the content.
811+
*
812+
* @param paddingLeft The left padding, in pixels.
813+
* @param paddingTop The top padding, in pixels.
814+
* @param paddingRight The right padding, in pixels.
815+
* @param paddingBottom The bottom padding, in pixels.
816+
*/
817+
public void setItemActiveIndicatorExpandedPadding(int paddingLeft, int paddingTop,
818+
int paddingRight, int paddingBottom) {
819+
itemActiveIndicatorExpandedPadding.left = paddingLeft;
820+
itemActiveIndicatorExpandedPadding.top = paddingTop;
821+
itemActiveIndicatorExpandedPadding.right = paddingRight;
822+
itemActiveIndicatorExpandedPadding.bottom = paddingBottom;
823+
if (buttons != null) {
824+
for (NavigationBarMenuItemView item : buttons) {
825+
if (item instanceof NavigationBarItemView) {
826+
((NavigationBarItemView) item)
827+
.setActiveIndicatorExpandedPadding(itemActiveIndicatorExpandedPadding);
828+
}
829+
}
830+
}
831+
}
832+
807833
/**
808834
* Get the {@link ShapeAppearanceModel} of the active indicator drawable.
809835
*
@@ -1128,6 +1154,7 @@ private NavigationBarItemView createMenuItem(
11281154
child.setActiveIndicatorExpandedHeight(itemActiveIndicatorExpandedHeight);
11291155
child.setActiveIndicatorMarginHorizontal(itemActiveIndicatorMarginHorizontal);
11301156
child.setItemGravity(itemGravity);
1157+
child.setActiveIndicatorExpandedPadding(itemActiveIndicatorExpandedPadding);
11311158
child.setActiveIndicatorExpandedMarginHorizontal(itemActiveIndicatorExpandedMarginHorizontal);
11321159
child.setActiveIndicatorDrawable(createItemActiveIndicatorDrawable());
11331160
child.setActiveIndicatorResizeable(itemActiveIndicatorResizeable);

lib/java/com/google/android/material/navigation/NavigationBarView.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,29 @@ public NavigationBarView(
388388
itemActiveIndicatorMarginHorizontal);
389389
setItemActiveIndicatorExpandedMarginHorizontal(itemActiveIndicatorExpandedMarginHorizontal);
390390

391+
int activeIndicatorExpandedDefaultStartEndPadding = getResources()
392+
.getDimensionPixelSize(R.dimen.m3_navigation_item_leading_trailing_space);
393+
int activeIndicatorExpandedStartPadding =
394+
activeIndicatorAttributes.getDimensionPixelOffset(
395+
R.styleable.NavigationBarActiveIndicator_expandedActiveIndicatorPaddingStart,
396+
activeIndicatorExpandedDefaultStartEndPadding);
397+
int activeIndicatorExpandedEndPadding =
398+
activeIndicatorAttributes.getDimensionPixelOffset(
399+
R.styleable.NavigationBarActiveIndicator_expandedActiveIndicatorPaddingEnd,
400+
activeIndicatorExpandedDefaultStartEndPadding);
401+
402+
setItemActiveIndicatorExpandedPadding(
403+
getLayoutDirection() == LAYOUT_DIRECTION_RTL
404+
? activeIndicatorExpandedEndPadding : activeIndicatorExpandedStartPadding,
405+
activeIndicatorAttributes.getDimensionPixelOffset(
406+
R.styleable.NavigationBarActiveIndicator_expandedActiveIndicatorPaddingTop,
407+
0),
408+
getLayoutDirection() == LAYOUT_DIRECTION_RTL
409+
? activeIndicatorExpandedStartPadding : activeIndicatorExpandedEndPadding,
410+
activeIndicatorAttributes.getDimensionPixelOffset(
411+
R.styleable.NavigationBarActiveIndicator_expandedActiveIndicatorPaddingBottom,
412+
0));
413+
391414
ColorStateList itemActiveIndicatorColor =
392415
MaterialResources.getColorStateList(
393416
context,
@@ -940,6 +963,19 @@ public void setItemActiveIndicatorExpandedMarginHorizontal(@Px int horizontalMar
940963
menuView.setItemActiveIndicatorExpandedMarginHorizontal(horizontalMargin);
941964
}
942965

966+
/**
967+
* Set the padding of the expanded active indicator wrapping the content.
968+
*
969+
* @param paddingLeft The left padding, in pixels.
970+
* @param paddingTop The top padding, in pixels.
971+
* @param paddingRight The right padding, in pixels.
972+
* @param paddingBottom The bottom padding, in pixels.
973+
*/
974+
public void setItemActiveIndicatorExpandedPadding(
975+
@Px int paddingLeft, @Px int paddingTop, @Px int paddingRight, @Px int paddingBottom) {
976+
menuView.setItemActiveIndicatorExpandedPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
977+
}
978+
943979
/**
944980
* Get the {@link ShapeAppearanceModel} of the active indicator drawable.
945981
*

lib/java/com/google/android/material/navigation/res-public/values/public.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@
6666
<public name="expandedWidth" type="attr"/>
6767
<public name="expandedHeight" type="attr"/>
6868
<public name="expandedMarginHorizontal" type="attr"/>
69+
<public name="expandedActiveIndicatorPaddingStart" type="attr"/>
70+
<public name="expandedActiveIndicatorPaddingEnd" type="attr"/>
71+
<public name="expandedActiveIndicatorPaddingTop" type="attr"/>
72+
<public name="expandedActiveIndicatorPaddingBottom" type="attr"/>
6973

7074
<public name="scaleLabelWithFontSize" type="attr"/>
7175
<public name="labelMaxLines" type="attr"/>

lib/java/com/google/android/material/navigation/res/values/attrs.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,18 @@
151151
<!--The start and end margin used by the navigation items' active indicator
152152
when it is expanded to wrap the item content. -->
153153
<attr name="expandedMarginHorizontal" format="dimension"/>
154+
<!-- The start padding of an items' active indicator when it is expanded to
155+
wrap the item content. -->
156+
<attr name="expandedActiveIndicatorPaddingStart" format="dimension"/>
157+
<!-- The end padding of an items' active indicator when it is expanded to
158+
wrap the item content. -->
159+
<attr name="expandedActiveIndicatorPaddingEnd" format="dimension"/>
160+
<!-- The top padding of an items' active indicator when it is expanded to
161+
wrap the item content. -->
162+
<attr name="expandedActiveIndicatorPaddingTop" format="dimension"/>
163+
<!-- The bottom padding of an items' active indicator when it is expanded to
164+
wrap the item content. -->
165+
<attr name="expandedActiveIndicatorPaddingBottom" format="dimension"/>
154166
</declare-styleable>
155167

156168
<declare-styleable name="NavigationView">

0 commit comments

Comments
 (0)