diff --git a/catalog/java/io/material/catalog/navigationdrawer/NavigationDrawerDemoActivity.java b/catalog/java/io/material/catalog/navigationdrawer/NavigationDrawerDemoActivity.java index 29ba36aadb6..e1cb1e0626a 100644 --- a/catalog/java/io/material/catalog/navigationdrawer/NavigationDrawerDemoActivity.java +++ b/catalog/java/io/material/catalog/navigationdrawer/NavigationDrawerDemoActivity.java @@ -46,6 +46,7 @@ public void handleOnBackPressed() { }; private DrawerLayout drawerLayout; + private MaterialSwitch autoCloseSwitch; @NonNull @Override @@ -91,13 +92,13 @@ public void onDrawerClosed(@NonNull View drawerView) { view.findViewById(R.id.show_end_drawer_gravity) .setOnClickListener(v -> drawerLayout.openDrawer(navigationViewEnd)); - MaterialSwitch materialSwitch = view.findViewById(R.id.bold_text_switch); - materialSwitch.setChecked(true); - materialSwitch.setOnCheckedChangeListener( + MaterialSwitch boldTextSwitch = view.findViewById(R.id.bold_text_switch); + boldTextSwitch.setOnCheckedChangeListener( (buttonView, isChecked) -> { navigationViewStart.setItemTextAppearanceActiveBoldEnabled(isChecked); navigationViewEnd.setItemTextAppearanceActiveBoldEnabled(isChecked); }); + autoCloseSwitch = view.findViewById(R.id.auto_close_switch); drawerLayout.post( () -> { @@ -115,7 +116,9 @@ private void initNavigationView(NavigationView navigationView) { navigationView.setNavigationItemSelectedListener( menuItem -> { navigationView.setCheckedItem(menuItem); - drawerLayout.closeDrawer(navigationView); + if (autoCloseSwitch.isChecked()) { + drawerLayout.closeDrawer(navigationView); + } return true; }); } diff --git a/catalog/java/io/material/catalog/navigationdrawer/res/layout/cat_navigationdrawer.xml b/catalog/java/io/material/catalog/navigationdrawer/res/layout/cat_navigationdrawer.xml index 10575cf3355..728b677ce4d 100644 --- a/catalog/java/io/material/catalog/navigationdrawer/res/layout/cat_navigationdrawer.xml +++ b/catalog/java/io/material/catalog/navigationdrawer/res/layout/cat_navigationdrawer.xml @@ -80,6 +80,25 @@ android:id="@+id/bold_text_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:checked="true" + android:layout_marginStart="12dp" /> + + + + + diff --git a/catalog/java/io/material/catalog/navigationdrawer/res/values/strings.xml b/catalog/java/io/material/catalog/navigationdrawer/res/values/strings.xml index a3d5ff0a714..2fc687eb808 100644 --- a/catalog/java/io/material/catalog/navigationdrawer/res/values/strings.xml +++ b/catalog/java/io/material/catalog/navigationdrawer/res/values/strings.xml @@ -35,6 +35,7 @@ Open End Drawer Bold active label + Close drawer on selection Mail Labels Label diff --git a/lib/java/com/google/android/material/internal/NavigationMenuItemView.java b/lib/java/com/google/android/material/internal/NavigationMenuItemView.java index 55f098db1d0..d55377a76c1 100644 --- a/lib/java/com/google/android/material/internal/NavigationMenuItemView.java +++ b/lib/java/com/google/android/material/internal/NavigationMenuItemView.java @@ -34,6 +34,7 @@ import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.view.ViewStub; import android.widget.CheckedTextView; import android.widget.FrameLayout; @@ -173,6 +174,10 @@ private void setActionView(@Nullable View actionView) { (FrameLayout) ((ViewStub) findViewById(R.id.design_menu_item_action_area_stub)).inflate(); } + // Make sure to remove the existing parent if the View is reused + if (actionView.getParent() != null) { + ((ViewGroup) actionView.getParent()).removeView(actionView); + } actionArea.removeAllViews(); actionArea.addView(actionView); } diff --git a/lib/java/com/google/android/material/internal/NavigationMenuPresenter.java b/lib/java/com/google/android/material/internal/NavigationMenuPresenter.java index 8f4bd38c11b..84674a9ef28 100644 --- a/lib/java/com/google/android/material/internal/NavigationMenuPresenter.java +++ b/lib/java/com/google/android/material/internal/NavigationMenuPresenter.java @@ -105,6 +105,7 @@ public class NavigationMenuPresenter implements MenuPresenter { /** Padding for separators between items */ int paddingSeparator; + private int overScrollMode = -1; @Override @@ -125,6 +126,9 @@ public MenuView getMenuView(ViewGroup root) { new NavigationMenuViewAccessibilityDelegate(menuView)); if (adapter == null) { adapter = new NavigationMenuAdapter(); + // Prevent recreating all the Views when notifyDataSetChanged() is called causing issues + // with the a11y reader (see b/112931425) + adapter.setHasStableIds(true); } if (overScrollMode != -1) { menuView.setOverScrollMode(overScrollMode); @@ -375,7 +379,7 @@ public int getSubheaderInsetEnd() { return this.subheaderInsetEnd; } - public void setSubheaderInsetEnd(@Px int subheaderInsetEnd) { + public void setSubheaderInsetEnd(@Px int subheaderInsetEnd) { this.subheaderInsetEnd = subheaderInsetEnd; updateMenuView(false); }