Skip to content

Commit 0ad4a8d

Browse files
Material Design Teamymarian
authored andcommitted
[NavigationRail] Moves OnNavigationItem listeners to the NavigationBarView class
to be easier used by developers and other libraries An example of where the current implementation fails is in Jetpack Navigation component where we rely on setOnNavigationItemSelectedListener and the similar methods in NavigationBarView (setOnItemSelectedListener) are protected. PiperOrigin-RevId: 367467206 (cherry picked from commit a200a5e)
1 parent 2c45dcc commit 0ad4a8d

File tree

6 files changed

+24
-42
lines changed

6 files changed

+24
-42
lines changed

catalog/java/io/material/catalog/navigationrail/NavigationRailDemoFragment.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import android.view.View;
2626
import android.view.ViewGroup;
2727
import android.widget.AdapterView;
28-
import android.widget.AdapterView.OnItemSelectedListener;
2928
import android.widget.ArrayAdapter;
3029
import android.widget.Button;
3130
import android.widget.Spinner;
@@ -36,8 +35,8 @@
3635
import androidx.core.math.MathUtils;
3736
import com.google.android.material.badge.BadgeDrawable;
3837
import com.google.android.material.badge.BadgeDrawable.BadgeGravity;
38+
import com.google.android.material.navigation.NavigationBarView.OnItemSelectedListener;
3939
import com.google.android.material.navigationrail.NavigationRailView;
40-
import com.google.android.material.navigationrail.NavigationRailView.OnNavigationItemSelectedListener;
4140
import io.material.catalog.feature.DemoFragment;
4241

4342
/** A base class that provides a demo screen structure for a single navigation rail demo. */
@@ -66,7 +65,7 @@ public View onCreateDemoView(
6665
initNavigationRail(getContext(), view);
6766
initNavigationRailDemoControls(view);
6867

69-
OnNavigationItemSelectedListener navigationItemListener =
68+
OnItemSelectedListener navigationItemListener =
7069
item -> {
7170
handleAllNavigationRailSelections(item.getItemId());
7271

@@ -178,7 +177,7 @@ protected void initNavigationRailDemoControls(View view) {
178177
badgeGravitySpinner.setAdapter(adapter);
179178

180179
badgeGravitySpinner.setOnItemSelectedListener(
181-
new OnItemSelectedListener() {
180+
new AdapterView.OnItemSelectedListener() {
182181
@Override
183182
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
184183
updateBadgeGravity(
@@ -214,8 +213,8 @@ private void initRemoveNavItemButton(Button removeNavItemButton) {
214213
});
215214
}
216215

217-
private void setNavigationRailListeners(OnNavigationItemSelectedListener listener) {
218-
navigationRailView.setOnNavigationItemSelectedListener(listener);
216+
private void setNavigationRailListeners(OnItemSelectedListener listener) {
217+
navigationRailView.setOnItemSelectedListener(listener);
219218
}
220219

221220
private void removeNavItemsFromNavigationRails() {

docs/components/BottomNavigation.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,13 @@ That results in:
102102
![Bottom navigation bar with a white background, one selected purple icon and
103103
another unselected icon.](assets/bottomnav/bottom-nav-default.png)
104104

105+
**Note:** We have deprecated the
106+
`BottomNavigationView#setOnNavigationItemSelectedListener` and
107+
`BottomNavigationView#setOnNavigationItemReselectedListener` methods in favor of
108+
the listeners in `NavigationBarView`. This will allow you to share the same
109+
selection code between both `BottomNavigation` and `NavigationRail` view
110+
elements.
111+
105112
### Making bottom navigation accessible
106113

107114
You should set an `android:title` for each of your `menu` items so that screen

docs/components/NavigationRail.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,10 @@ an icon and a text label.
7878
In code:
7979

8080
```kt
81-
NavigationRailView.OnNavigationItemSelectedListener { item ->
81+
// Listeners are defined on the super class NavigationBarView
82+
// to support both NavigationRail and BottomNavigation with the
83+
// same listeners
84+
NavigationBarView.OnNavigationItemSelectedListener { item ->
8285
when(item.itemId) {
8386
R.id.item1 -> {
8487
// Respond to navigation item 1 click

lib/java/com/google/android/material/bottomnavigation/BottomNavigationView.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ private void addCompatibilityTopDivider(@NonNull Context context) {
193193
* @param listener The listener to notify
194194
* @see #setOnNavigationItemReselectedListener(OnNavigationItemReselectedListener)
195195
*/
196+
@Deprecated
196197
public void setOnNavigationItemSelectedListener(
197198
@Nullable OnNavigationItemSelectedListener listener) {
198199
setOnItemSelectedListener(listener);
@@ -205,14 +206,17 @@ public void setOnNavigationItemSelectedListener(
205206
* @param listener The listener to notify
206207
* @see #setOnNavigationItemSelectedListener(OnNavigationItemSelectedListener)
207208
*/
209+
@Deprecated
208210
public void setOnNavigationItemReselectedListener(
209211
@Nullable OnNavigationItemReselectedListener listener) {
210212
setOnItemReselectedListener(listener);
211213
}
212214

213215
/** Listener for handling selection events on bottom navigation items. */
216+
@Deprecated
214217
public interface OnNavigationItemSelectedListener extends OnItemSelectedListener {}
215218

216219
/** Listener for handling reselection events on bottom navigation items. */
220+
@Deprecated
217221
public interface OnNavigationItemReselectedListener extends OnItemReselectedListener {}
218222
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ public void setElevation(float elevation) {
312312
* @param listener The listener to notify
313313
* @see #setOnItemReselectedListener(OnItemReselectedListener)
314314
*/
315-
protected void setOnItemSelectedListener(@Nullable OnItemSelectedListener listener) {
315+
public void setOnItemSelectedListener(@Nullable OnItemSelectedListener listener) {
316316
selectedListener = listener;
317317
}
318318

@@ -323,7 +323,7 @@ protected void setOnItemSelectedListener(@Nullable OnItemSelectedListener listen
323323
* @param listener The listener to notify
324324
* @see #setOnItemSelectedListener(OnItemSelectedListener)
325325
*/
326-
protected void setOnItemReselectedListener(@Nullable OnItemReselectedListener listener) {
326+
public void setOnItemReselectedListener(@Nullable OnItemReselectedListener listener) {
327327
reselectedListener = listener;
328328
}
329329

@@ -681,7 +681,7 @@ public void removeBadge(int menuItemId) {
681681
}
682682

683683
/** Listener for handling selection events on navigation items. */
684-
protected interface OnItemSelectedListener {
684+
public interface OnItemSelectedListener {
685685

686686
/**
687687
* Called when an item in the navigation menu is selected.
@@ -695,7 +695,7 @@ protected interface OnItemSelectedListener {
695695
}
696696

697697
/** Listener for handling reselection events on navigation items. */
698-
protected interface OnItemReselectedListener {
698+
public interface OnItemReselectedListener {
699699

700700
/**
701701
* Called when the currently selected item in the navigation menu is selected again.

lib/java/com/google/android/material/navigationrail/NavigationRailView.java

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -260,37 +260,6 @@ protected NavigationRailMenuView createNavigationBarMenuView(@NonNull Context co
260260
return new NavigationRailMenuView(context);
261261
}
262262

263-
/**
264-
* Sets a listener that will be notified when a navigation rail item is selected. This listener
265-
* will also be notified when the currently selected item is reselected, unless an {@link
266-
* OnNavigationItemReselectedListener} has also been set.
267-
*
268-
* @param listener The listener to notify
269-
* @see #setOnNavigationItemReselectedListener(OnNavigationItemReselectedListener)
270-
*/
271-
public void setOnNavigationItemSelectedListener(
272-
@Nullable OnNavigationItemSelectedListener listener) {
273-
setOnItemSelectedListener(listener);
274-
}
275-
276-
/**
277-
* Sets a listener that will be notified when the currently selected navigation rail item is
278-
* reselected. This does not require an {@link OnNavigationItemSelectedListener} to be set.
279-
*
280-
* @param listener The listener to notify
281-
* @see #setOnNavigationItemSelectedListener(OnNavigationItemSelectedListener)
282-
*/
283-
public void setOnNavigationItemReselectedListener(
284-
@Nullable OnNavigationItemReselectedListener listener) {
285-
setOnItemReselectedListener(listener);
286-
}
287-
288-
/** Listener for handling selection events on bottom navigation items. */
289-
public interface OnNavigationItemSelectedListener extends OnItemSelectedListener {}
290-
291-
/** Listener for handling reselection events on bottom navigation items. */
292-
public interface OnNavigationItemReselectedListener extends OnItemReselectedListener {}
293-
294263
private int makeMinWidthSpec(int measureSpec) {
295264
int minWidth = getSuggestedMinimumWidth();
296265
if (MeasureSpec.getMode(measureSpec) != MeasureSpec.EXACTLY && minWidth > 0) {

0 commit comments

Comments
 (0)