You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 21:07:35