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

如何修复Android API26+下EditText向下导航焦点卡住问题

Android API26-28版本EditText方向键焦点卡住问题修复

问题现象

完全相同的APK在不同Android版本上键盘导航表现不一致,复现问题的简化布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <Button
        android:id="@+id/top_button"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:padding="0dp"
        android:text="Top"
        android:textSize="14sp" />

    <EditText
        android:id="@+id/filename"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:inputType="textNoSuggestions"
        android:singleLine="true"
        android:textSize="14sp" />

    <Button
        android:id="@+id/bottom_button"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:padding="0dp"
        android:text="Bottom"
        android:textSize="14sp" />

</LinearLayout>

不同导航操作的版本表现差异:

  • Tab键切换焦点:全版本表现一致,焦点从Top按钮出发,经EditText正常移动到底部Bottom按钮,符合预期
  • 向下方向键导航:
    • API26之前、API29及以上版本:焦点可正常从Top按钮经EditText移动到底部按钮
    • API26-28(Android 8.0-9.0)版本:焦点移动到EditText后卡住,无法继续向下移动

问题根因

经多版本模拟器验证,该问题是Android 8.0(API26)引入、Android 10.0(API29)修复的系统原生bug,和应用自身布局逻辑无关,仅需针对API26-28版本做兼容处理即可。

修复方案

给EditText设置按键监听,仅在bug影响的版本区间拦截向下方向键事件,复用系统自带的焦点查找能力手动转移焦点,避免触发有缺陷的默认处理逻辑。

Kotlin实现代码

val fileNameEt = findViewById<EditText>(R.id.filename)
if (Build.VERSION.SDK_INT in Build.VERSION_CODES.O..Build.VERSION_CODES.P) {
    fileNameEt.setOnKeyListener { view, keyCode, event ->
        if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN && event.action == KeyEvent.ACTION_UP) {
            val nextFocusView = view.focusSearch(View.FOCUS_DOWN)
            nextFocusView?.requestFocus()
            return@setOnKeyListener true
        }
        false
    }
}

Java实现代码

EditText fileNameEt = findViewById(R.id.filename);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
    fileNameEt.setOnKeyListener((view, keyCode, event) -> {
        if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN && event.getAction() == KeyEvent.ACTION_UP) {
            View nextFocusView = view.focusSearch(View.FOCUS_DOWN);
            if (nextFocusView != null) {
                nextFocusView.requestFocus();
            }
            return true;
        }
        return false;
    });
}

方案说明

  • 版本判断逻辑保证兼容代码仅在存在bug的系统版本上生效,不会干扰其他版本的原生导航行为
  • 直接调用系统focusSearch接口查找下一个焦点控件,不需要硬编码目标控件ID,后续布局调整时无需同步修改这段兼容代码
  • 如果测试发现向上方向键也存在焦点卡住的问题,可以用相同逻辑拦截KEYCODE_DPAD_UP事件,查找View.FOCUS_UP方向的控件转移焦点即可

内容的提问来源于stack exchange,提问作者Craig Heath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:51:58