Skip to content

Commit 6df6a92

Browse files
committed
Fixing text field icons that are not clickable having ripple effect when text field is pressed.
Non clickable ImageViews inherit pressed state of parent views, so icons appeared as pressed even if they were not clickable/focusable. PiperOrigin-RevId: 278381886 (cherry picked from commit 27f7f4c)
1 parent 5fe1ea3 commit 6df6a92

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

lib/java/com/google/android/material/internal/CheckableImageButton.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public class CheckableImageButton extends AppCompatImageButton implements Checka
4242

4343
private boolean checked;
4444
private boolean checkable = true;
45+
private boolean pressable = true;
4546

4647
public CheckableImageButton(Context context) {
4748
this(context, null);
@@ -92,6 +93,13 @@ public void toggle() {
9293
setChecked(!checked);
9394
}
9495

96+
@Override
97+
public void setPressed(boolean pressed) {
98+
if (pressable) {
99+
super.setPressed(pressed);
100+
}
101+
}
102+
95103
@Override
96104
public int[] onCreateDrawableState(int extraSpace) {
97105
if (checked) {
@@ -136,6 +144,16 @@ public boolean isCheckable() {
136144
return checkable;
137145
}
138146

147+
/** Sets image button to be pressable or not. */
148+
public void setPressable(boolean pressable) {
149+
this.pressable = pressable;
150+
}
151+
152+
/** Returns whether the image button is pressable. */
153+
public boolean isPressable() {
154+
return pressable;
155+
}
156+
139157
static class SavedState extends AbsSavedState {
140158

141159
boolean checked;

lib/java/com/google/android/material/textfield/TextInputLayout.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,7 @@ public TextInputLayout(@NonNull Context context, @Nullable AttributeSet attrs, i
574574
ViewCompat.setImportantForAccessibility(
575575
errorIconView, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
576576
errorIconView.setClickable(false);
577+
errorIconView.setPressable(false);
577578
errorIconView.setFocusable(false);
578579

579580
final int helperTextTextAppearance =
@@ -2999,26 +3000,27 @@ private void applyIconTint(
29993000
}
30003001

30013002
private static void setIconOnClickListener(
3002-
@NonNull View iconView,
3003+
@NonNull CheckableImageButton iconView,
30033004
@Nullable OnClickListener onClickListener,
30043005
@Nullable OnLongClickListener onLongClickListener) {
30053006
iconView.setOnClickListener(onClickListener);
30063007
setIconClickable(iconView, onLongClickListener);
30073008
}
30083009

30093010
private static void setIconOnLongClickListener(
3010-
@NonNull View iconView, @Nullable OnLongClickListener onLongClickListener) {
3011+
@NonNull CheckableImageButton iconView, @Nullable OnLongClickListener onLongClickListener) {
30113012
iconView.setOnLongClickListener(onLongClickListener);
30123013
setIconClickable(iconView, onLongClickListener);
30133014
}
30143015

30153016
private static void setIconClickable(
3016-
@NonNull View iconView, @Nullable OnLongClickListener onLongClickListener) {
3017+
@NonNull CheckableImageButton iconView, @Nullable OnLongClickListener onLongClickListener) {
30173018
boolean iconClickable = ViewCompat.hasOnClickListeners(iconView);
30183019
boolean iconLongClickable = onLongClickListener != null;
30193020
boolean iconFocusable = iconClickable || iconLongClickable;
30203021
iconView.setFocusable(iconFocusable);
30213022
iconView.setClickable(iconClickable);
3023+
iconView.setPressable(iconClickable);
30223024
iconView.setLongClickable(iconLongClickable);
30233025
ViewCompat.setImportantForAccessibility(
30243026
iconView,

0 commit comments

Comments
 (0)