Android EditText长文本省略显示+点击可编辑且光标置尾方案咨询
嘿,这个场景我太熟了!Android原生EditText确实在「文本过长显示省略号」和「可编辑切换」之间存在兼容性问题——要么能显示省略但点不动,要么能编辑但省略效果直接失效。我给你分享两个亲测有效的解决思路,按需选就行:
方案一:自定义EditText(推荐,复用性强)
核心思路是给EditText加个状态标记,通过点击事件切换「不可编辑(显示省略)」和「可编辑」状态,同时在状态切换时调整焦点、KeyListener等属性,让ellipsize能正常生效。
直接上代码:
public class ToggleEllipsizeEditText extends AppCompatEditText { // 标记当前是否处于可编辑状态 private boolean isEditableMode = false; public ToggleEllipsizeEditText(Context context) { super(context); initView(); } public ToggleEllipsizeEditText(Context context, AttributeSet attrs) { super(context, attrs); initView(); } public ToggleEllipsizeEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } private void initView() { // 初始状态:不可编辑,显示末尾省略 setEllipsize(TextUtils.TruncateAt.END); setSingleLine(true); // 单行省略,需要多行的话改成对应maxLines值 setFocusable(false); setFocusableInTouchMode(false); setKeyListener(null); // 去掉编辑能力,让ellipsize生效 } @Override public boolean onTouchEvent(MotionEvent event) { // 点击时切换到可编辑状态 if (event.getAction() == MotionEvent.ACTION_UP && !isEditableMode) { isEditableMode = true; // 恢复编辑能力 setFocusable(true); setFocusableInTouchMode(true); setKeyListener(getDefaultKeyListener()); // 请求焦点并把光标移到文本末尾 requestFocus(); setSelection(getText().length()); return true; } return super.onTouchEvent(event); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(focused, direction, previouslyFocusedRect); // 失去焦点时切回不可编辑状态,恢复省略显示 if (!focused && isEditableMode) { isEditableMode = false; setFocusable(false); setFocusableInTouchMode(false); setKeyListener(null); // 强制触发ellipsize生效 setEllipsize(TextUtils.TruncateAt.END); } } }
布局里直接用这个自定义控件就行:
<com.your.package.name.ToggleEllipsizeEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入内容..." android:text="这是一段超长超长超长超长超长超长超长超长超长的测试文本" />
方案二:TextView + EditText组合(简单易上手)
如果不想自定义控件,也可以用「TextView显示省略态,EditText负责编辑态」的组合方式,点击时切换两个控件的可见性。
布局代码:
<FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- 初始显示的省略态TextView --> <TextView android:id="@+id/tv_ellipsize_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="1" android:text="这是一段超长超长超长超长超长超长超长超长超长的测试文本" android:textSize="16sp" /> <!-- 编辑态的EditText,初始隐藏 --> <EditText android:id="@+id/et_editable_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" android:textSize="16sp" /> </FrameLayout>
Activity里的逻辑处理:
TextView tvEllipsize = findViewById(R.id.tv_ellipsize_view); EditText etEditable = findViewById(R.id.et_editable_view); // 点击TextView切换到编辑态 tvEllipsize.setOnClickListener(v -> { tvEllipsize.setVisibility(View.GONE); etEditable.setVisibility(View.VISIBLE); etEditable.setText(tvEllipsize.getText()); // 请求焦点并把光标移到末尾 etEditable.requestFocus(); etEditable.setSelection(etEditable.getText().length()); }); // EditText失去焦点时切回省略态 etEditable.setOnFocusChangeListener((v, hasFocus) -> { if (!hasFocus) { tvEllipsize.setText(etEditable.getText()); etEditable.setVisibility(View.GONE); tvEllipsize.setVisibility(View.VISIBLE); } });
小提醒
如果需要多行省略,只要把两个方案里的setSingleLine(true)改成setLines(3)或者在布局里设置android:maxLines="3"就行,TextView和EditText的样式尽量保持一致,避免切换时出现视觉跳变。
内容的提问来源于stack exchange,提问作者Angelina
相关产品推荐
相关产品推荐

