#9363·kivy

Window.softinput_mode = "below_target" 会导致视口跳转和 Android 上的 `TextInput` 焦点/ Cursor 问题

作者: kengoon创建于 2026年8月14日更新于 2026年8月14日

软件版本

  • Python: 3.14.2
  • 操作系统: Android
  • Kivy: 3.0.0
  • Kivy 安装方法: Buildozer

描述

在 Android 上使用 Window.softinput_mode = "below_target" 时,软键盘和 TextInput 处理似乎存在两个相关问题:

  1. 当 Android 软键盘消失后,整个 Kivy 窗口/内容会暂时向上移动,然后恢复到正常位置。
  2. 点击已聚焦的 TextInput 以移动 Cursor 或选择文本会导致 TextInput 失去焦点,并关闭键盘。 这两个问题似乎都与 below_target 软输入模式所应用的视口平移有关。

重现代码

python
from kivy.app import App
from kivy.core.window import Window
from kivy.lang import Builder
Window.softinput_mode = "below_target"
KV = """
BoxLayout:
    orientation: "vertical"
    padding: "20dp"
    spacing: "20dp"
    Widget:
    TextInput:
        size_hint_y: None
        height: "48dp"
        text: "Tap here, then tap between these characters"
        multiline: False
    Widget:
class TestApp(App):
    def build(self):
        return Builder.load_string(KV)
TestApp().run()

https://GitHub.com/user-attachments/assets/d1b95bc7-bb53-459b-94b3-781c7a8ab017

重现步骤

问题 1: 视口在键盘消失后向上跳动

  1. 在 Android 上构建并运行应用程序。
  2. 点击 TextInput
  3. Android 软键盘出现。
  4. 点击 TextInput 外部以关闭键盘。
  5. 观察内容/窗口的移动。

问题 2: 点击已聚焦的 TextInput 会关闭键盘

  1. 在 Android 上构建并运行应用程序。
  2. 点击 TextInput
  3. Android 软键盘出现。
  4. 在同一个 TextInput 内部,在字符之间点击以移动 Cursor 或选择文本。
  5. 观察 TextInput 失去焦点并关闭键盘。

实际行为

问题 1

在点击 TextInput 外部后:

  1. 键盘消失。
  2. 整个 Kivy 窗口/内容暂时向上移动,好像 Kivy 仍然认为键盘可见。
  3. 窗口/内容然后移回到正常位置。 这会产生可见的闪烁/跳动。

问题 2

当点击已聚焦的 TextInput 时:

  • TextInput 失去焦点
  • Android 软键盘关闭
  • Cursor 不能可靠地在字符之间移动
  • 文本选择不起作用可靠

预期行为

问题 1

当键盘被关闭时,窗口/内容应直接返回到其正常位置。 在键盘不再可见时,不应有额外的向上移动。

问题 2

当点击已聚焦的 TextInput 时:

  • TextInput 保持聚焦
  • 键盘保持可见
  • Cursor 移动到点击位置
  • 文本选择正常工作