MaterialAutoCompleteTextView清空文本后高度无法恢复问题求助
解决TextInputLayout清空文本+隐藏自定义EndIcon后高度不回缩的问题
问题重现
布局代码:
<com.google.android.material.textfield.TextInputLayout android:id="@+id/til_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="16dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_goneMarginEnd="0dp"> <com.google.android.material.textfield.MaterialAutoCompleteTextView android:id="@+id/et_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true" android:hint="text" android:textCursorDrawable="@drawable/orange_cursor" android:textSize="16sp" /> </com.google.android.material.textfield.TextInputLayout>
相关逻辑代码:
private void setupCrossEndIcon() { binding.tilName.setEndIconMode(END_ICON_CUSTOM); binding.tilName.setEndIconOnClickListener(v -> onCrossClicked()); binding.tilName.setEndIconVisible(true); binding.tilName.setEndIconDrawable(R.drawable.ic_cross); setEndIconColor(); } private void onCrossClicked() { binding.etName.setText(""); binding.tilName.setEndIconVisible(false); }
当在MaterialAutoCompleteTextView中输入多行文本后,点击清除图标执行onCrossClicked,无论调整setText和setEndIconVisible(false)的顺序,TextInputLayout都会保持多行时的高度;但移除setEndIconVisible(false)后,高度能正常回缩。尝试过invalidateLayout()、setMaxLines(1)、设置endIconDrawable(null)以及升级material库到1.9.0都无效。
解决方案
尝试以下两种方法:
方法1:延迟隐藏EndIcon并强制重绘
利用post让文本框先完成布局更新,再隐藏图标并触发重绘:
private void onCrossClicked() { binding.etName.setText(""); binding.etName.post(() -> { binding.tilName.setEndIconVisible(false); binding.tilName.requestLayout(); }); }
方法2:切换EndIconMode而非仅隐藏
通过切换endIconMode为END_ICON_NONE替代setEndIconVisible(false),后续需要显示清除图标时再切回END_ICON_CUSTOM并重新设置drawable:
private void onCrossClicked() { binding.etName.setText(""); binding.tilName.setEndIconMode(TextInputLayout.END_ICON_NONE); } // 后续需要显示清除图标时调用 private void showClearIcon() { binding.tilName.setEndIconMode(TextInputLayout.END_ICON_CUSTOM); binding.tilName.setEndIconDrawable(R.drawable.ic_cross); setEndIconColor(); }
原理说明
该问题源于TextInputLayout隐藏自定义EndIcon时,内部测量逻辑未正确响应文本框内容变化,导致布局高度未重新计算。延迟操作或切换IconMode可避免测量逻辑冲突,requestLayout则能强制控件重新计算自身尺寸。
内容的提问来源于stack exchange,提问作者amsuredev
相关产品推荐
相关产品推荐

