Android TextInputEditText光标位置不聚焦,编辑长文本时焦点跳转至底部问题求助
解决TextInputEditText编辑长文本时光标跳至底部的问题
我碰到过一模一样的问题!当在Material Design的TextInputEditText里编辑长文本时,焦点自动跳到底部,导致顶部输入区域直接移出屏幕,完全看不到正在输入的内容,确实挺闹心的。结合你提供的代码和Material库版本,给你几个亲测有效的解决方案:
可能的原因
在1.5.0版本的Material库中,FilledBox样式的TextInputLayout搭配多行TextInputEditText时,存在布局测量或焦点处理的逻辑bug,这是导致这个问题的主要原因。
解决方案
方案一:调整布局属性(最快见效)
修改TextInputEditText的高度属性,同时添加文本对齐规则,让文本从顶部开始显示,避免布局计算异常:
<com.google.android.material.textfield.TextInputLayout style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Notes" app:boxBackgroundColor="@android:color/transparent" app:hintAnimationEnabled="false" app:passwordToggleEnabled="false"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/notes" android:layout_width="match_parent" android:layout_height="match_parent" android:hint="Notes" android:imeOptions="flagNoExtractUi" android:inputType="textMultiLine" android:gravity="top|start" android:minHeight="120dp"/> </com.google.android.material.textfield.TextInputLayout>
这里做了三个关键调整:
- 把
layout_height从wrap_content改为match_parent,让EditText占满父布局的可用空间 - 添加
android:gravity="top|start",强制文本从左上角开始排列 - 新增
android:minHeight,保证输入框有足够的初始显示高度
方案二:升级Material库版本(根治bug)
1.5.0版本属于比较旧的稳定版,很多焦点相关的小bug在后续版本中已经被修复。建议升级到较新的稳定版本,比如:
implementation 'com.google.android.material:material:1.9.0'
升级后,大部分这类布局异常问题都会自动消失,同时还能获得Material Design的新特性和性能优化。
方案三:代码手动控制焦点与滚动(兜底方案)
如果上面两种方法都不生效,可以通过代码手动控制EditText的滚动位置,确保光标区域始终在屏幕内:
val notesEditText = findViewById<TextInputEditText>(R.id.notes) notesEditText.setOnFocusChangeListener { v, hasFocus -> if (hasFocus) { v.post { // 获取光标所在行的顶部位置,滚动到视图中间区域 val lineTop = notesEditText.layout.getLineTop(notesEditText.selectionStart) val targetScrollY = lineTop - notesEditText.height / 2 notesEditText.scrollTo(0, targetScrollY) } } }
这段代码会在EditText获取焦点时,自动把光标所在行滚动到输入框的中间位置,保证你能清晰看到正在输入的内容。
内容的提问来源于stack exchange,提问作者erkan.molla.dev
相关产品推荐
相关产品推荐

