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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:32:51