From 30f9eff3320dcf06af85b738e9eb49eb43abc096 Mon Sep 17 00:00:00 2001 From: pubiqq Date: Wed, 29 Oct 2025 22:52:20 +0300 Subject: [PATCH] [Button] Fix click sound for checkable button --- .../android/material/button/MaterialButton.java | 13 +++++++++++-- .../material/button/MaterialButtonToggleGroup.java | 1 - .../material/button/MaterialSplitButton.java | 2 -- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/java/com/google/android/material/button/MaterialButton.java b/lib/java/com/google/android/material/button/MaterialButton.java index 9892ce117ae..269eca50ff2 100644 --- a/lib/java/com/google/android/material/button/MaterialButton.java +++ b/lib/java/com/google/android/material/button/MaterialButton.java @@ -49,6 +49,7 @@ import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; +import android.view.SoundEffectConstants; import android.view.View; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; @@ -1346,11 +1347,19 @@ public void toggle() { @Override public boolean performClick() { - if (isEnabled() && materialButtonHelper.isToggleCheckedStateOnClick()) { + final boolean checkable = isCheckable() && materialButtonHelper.isToggleCheckedStateOnClick(); + if (checkable) { toggle(); } - return super.performClick(); + final boolean handled = super.performClick(); + if (checkable && !handled) { + // View only makes a sound effect if the onClickListener was + // called, so for checkable button we'll need to make one here instead. + playSoundEffect(SoundEffectConstants.CLICK); + } + + return handled; } /** diff --git a/lib/java/com/google/android/material/button/MaterialButtonToggleGroup.java b/lib/java/com/google/android/material/button/MaterialButtonToggleGroup.java index 099ce61244c..f3ccb531dee 100644 --- a/lib/java/com/google/android/material/button/MaterialButtonToggleGroup.java +++ b/lib/java/com/google/android/material/button/MaterialButtonToggleGroup.java @@ -535,7 +535,6 @@ void onButtonCheckedStateChanged(@NonNull MaterialButton button, boolean isCheck if (skipCheckedStateTracker) { return; } - button.playSoundEffect(SoundEffectConstants.CLICK); checkInternal(button.getId(), isChecked); } } diff --git a/lib/java/com/google/android/material/button/MaterialSplitButton.java b/lib/java/com/google/android/material/button/MaterialSplitButton.java index c4dcd8de16f..04559b876e9 100644 --- a/lib/java/com/google/android/material/button/MaterialSplitButton.java +++ b/lib/java/com/google/android/material/button/MaterialSplitButton.java @@ -119,8 +119,6 @@ public void addView(@NonNull View child, int index, @Nullable ViewGroup.LayoutPa buttonChild.addOnCheckedChangeListener( (button, isChecked) -> { - // Play sound effect when checked state changes. - button.playSoundEffect(SoundEffectConstants.CLICK); // Update content description when checked state changes. ViewCompat.setStateDescription( buttonChild,