如何设置TextInputLayout错误信息Gravity使其显示在顶部
解答
TextInputLayout 原生没有提供公开API可直接修改错误提示的Gravity属性、将错误文本挪到控件顶部。默认错误提示View在控件内部布局中是固定约束在输入区域下方的,单纯给错误文本设置Gravity仅能修改文字横向对齐效果,无法改变它在控件内的纵向位置。
如果要实现顶部错误提示,同时避免逐处修改现有布局的大量工作量,可以采用一次配置全局生效的方案:
自定义TextInputLayout + 全局布局自动替换
1. 自定义控件实现顶部错误逻辑
继承原生TextInputLayout,在内部找到错误提示的TextView,调整它的布局位置到控件顶部:
class TopErrorTextInputLayout @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null ) : TextInputLayout(context, attrs) { private var errorTv: TextView? = null override fun onViewAdded(child: View?) { super.onViewAdded(child) // 识别控件内部的错误提示文本View if (child?.id == com.google.android.material.R.id.textinput_error) { errorTv = child as TextView val layoutParams = child.layoutParams as LayoutParams // 将错误View的位置约束到顶部 layoutParams.gravity = Gravity.TOP // 预留输入框高度,避免错误文字遮挡输入内容,数值替换为项目自身输入框高度即可 setContentPadding( paddingLeft, resources.getDimensionPixelSize(R.dimen.dp_40), paddingRight, paddingBottom ) child.layoutParams = layoutParams } } override fun setError(error: CharSequence?) { super.setError(error) errorTv?.gravity = Gravity.START } }
2. 全局替换原生控件,无需修改现有布局
在项目的BaseActivity中自定义LayoutInflater.Factory2,在布局加载阶段自动将所有原生com.google.android.material.textfield.TextInputLayout替换为你实现的TopErrorTextInputLayout,现有布局文件不需要做任何改动,所有使用场景会自动适配顶部错误提示效果。

补充:如果使用Material Components 1.9.0+版本,可以直接在控件的style中配置
errorIconDrawable的位置、错误文字的边距,但核心的纵向位置调整依然需要上述自定义逻辑,官方目前没有提供直接将错误提示放在顶部的属性。
内容的提问来源于stack exchange,提问作者ZarNi Myo Sett Win
相关产品推荐
相关产品推荐

