Android开发如何为TextInputEditText启用ellipsize省略效果?
TextInputEditText 开启ellipsize末尾省略效果的实现方法
TextInputEditText 作为可编辑输入组件,默认状态下不会响应XML中配置的ellipsize属性,这是组件本身的行为限制:可编辑状态下的输入框需要保证光标定位、文本滚动逻辑正常,默认不会触发文本省略计算。普通EditText设置android:editable="false"后会切换到类TextView的渲染逻辑,所以能正常显示省略号,但editable属性已被官方废弃,不建议直接使用。
方案1:仅做文本展示,不需要编辑能力
在原有singleLine="true"、ellipsize="end"配置的基础上,补充以下属性即可让省略效果生效:
<com.google.android.material.textfield.TextInputEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" android:inputType="text" android:cursorVisible="false" android:focusable="false" android:focusableInTouchMode="false" android:longClickable="false" android:text="asdf asf asf asf sa fdasdf asf asf asf sa fdasdf asf asf asf sa fdasdf asf asf asf sa fdasdf asf asf asf sa fd" />
也可以在代码中动态配置:
val editText = findViewById<TextInputEditText>(R.id.textField) editText.apply { isCursorVisible = false isFocusable = false isFocusableInTouchMode = false isLongClickable = false keyListener = null // 彻底关闭编辑能力,拦截软键盘弹出 }
方案2:需要保留编辑能力,未聚焦时显示省略号
如果需要输入框正常可编辑,仅在未获取焦点时显示末尾省略号,可以通过焦点监听动态切换ellipsize状态:
editText.setOnFocusChangeListener { view, hasFocus -> val inputEt = view as TextInputEditText if (hasFocus) { // 获得焦点时关闭省略,展示完整文本供编辑 inputEt.ellipsize = null } else { // 失去焦点时开启末尾省略,同时将光标移到文本末尾避免截断位置异常 inputEt.ellipsize = TextUtils.TruncateAt.END inputEt.setSelection(inputEt.text?.length ?: 0) } }
注意事项
- 禁止使用已废弃的
android:editable="false"属性,该属性在Android 10及以上版本存在兼容性问题 - 如果需要保留长按弹出复制/粘贴菜单的能力,可以移除
android:longClickable="false"配置,但该场景下省略效果在部分厂商定制ROM上可能出现显示异常
内容的提问来源于stack exchange,提问作者miga
相关产品推荐
相关产品推荐

