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

如何禁用Android键盘仅显示Kivy键盘及解决相关自定义问题

Kivy Android平台键盘问题解决方案

问题1:禁用Android系统键盘,仅保留Kivy键盘

要解决Android系统键盘与Kivy键盘同时弹出的问题,需从Kivy配置和Android打包配置两个层面调整:

  1. Kivy代码配置
    修改键盘模式配置,强制使用Kivy的dock键盘,并阻止系统键盘触发:

    from kivy.config import Config
    # 强制启用Kivy dock键盘,禁用系统软键盘触发
    Config.set('kivy', 'keyboard_mode', 'dock')
    Config.set('input', 'mouse', 'mouse,disable_multitouch')
    

    同时在自定义TextInput中添加属性,明确拒绝系统键盘唤起:

    class CustomTextInput(TextInput):
        def __init__(self,**kwargs):
            super(CustomTextInput,self).__init__(**kwargs)
            self.input_type = 'text'  # 阻止系统键盘触发
            self.setup_keyboard()
    
  2. Android打包配置
    使用Buildozer打包时,在buildozer.spec中添加AndroidManifest属性,禁止系统自动弹出软键盘:

    android.add_manifest_intent_filters = android:windowSoftInputMode="stateAlwaysHidden"
    

    也可直接修改生成的AndroidManifest.xml,在<activity>标签内加入:

    android:windowSoftInputMode="stateAlwaysHidden"
    

问题2:Android键盘遮挡组件及自定义问题

遮挡组件的解决

若选择使用Android系统键盘,Window.softinput_mode在部分设备上可能失效,可通过以下两种方式适配:

  • 用ScrollView包裹布局:允许键盘弹出时滚动查看被遮挡内容,修改main.kv:
    <StartApp>:
        ScrollView:
            BoxLayout:
                orientation: 'vertical'
                size_hint_y: None
                height: self.minimum_height
                
                CustomTextInput:
                    size_hint_y: None
                    height: 50
                Button:
                    text: 'press me'
                    size_hint_y: None
                    height: 50
                Widget:
                    size_hint_y: None
                    height: 400
    
  • 监听键盘高度动态调整布局:通过pyjnius获取Android键盘高度,实时修改布局位置:
    from kivy.core.window import Window
    from jnius import autoclass
    
    class MainApp(App):
        def build(self):
            Window.bind(on_keyboard_height=self.on_keyboard_height)
            return WindowManager()
        
        def on_keyboard_height(self, _, height):
            # 根据键盘高度调整主布局位置
            self.root.get_screen('start').children[0].children[0].y = -height if height > 0 else 0
    

Android键盘自定义限制

Android系统键盘的颜色、大小、位置等样式无法通过Kivy直接自定义,这些属性由系统输入法或用户的输入法设置决定。如果需要定制化键盘,建议:

  • 继续使用Kivy自定义键盘,通过修改kb.widget的background_color、font_size等属性实现样式定制,这是最可控的方案。
  • 开发自定义Android输入法,但需要原生Android开发知识,且需用户手动切换输入法才能生效。

修改后的完整代码

main.py

from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.config import Config
from kivy.uix.textinput import TextInput
from kivy.core.window import Window
from jnius import autoclass

# 配置Kivy键盘模式,禁用系统键盘触发
Config.set('kivy','keyboard_mode', 'dock')
Config.set('input', 'mouse', 'mouse,disable_multitouch')

Window.keyboard_anim_args = {'d':.2,'t':'in_out_expo'}
Window.softinput_mode = 'below_target'

class CustomTextInput(TextInput):
    def __init__(self,**kwargs):
        super(CustomTextInput,self).__init__(**kwargs)
        self.input_type = 'text'  # 阻止系统键盘触发
        self.setup_keyboard()

    def setup_keyboard(self):
        kb = Window.request_keyboard(self._keyboard_close, self)
        if kb.widget:
            # 自定义Kivy键盘样式
            kb.widget.key_background_color = (1,1,0,1)
            kb.widget.font_size = 25
            kb.widget.layout = 'numeric.json'

    def _keyboard_close(self):
        pass

class StartApp(Screen):
    pass

class WindowManager(ScreenManager):
    pass

class MainApp(App):
    def build(self):
        Window.bind(on_keyboard_height=self.on_keyboard_height)
        return WindowManager()
    
    def on_keyboard_height(self, _, height):
        # 根据键盘高度调整布局位置
        self.root.get_screen('start').children[0].children[0].y = -height if height > 0 else 0

MainApp().run()

main.kv

<WindowManager>:
    StartApp:
        name: 'start'

<StartApp>:
    ScrollView:
        BoxLayout:
            orientation: 'vertical'
            size_hint_y: None
            height: self.minimum_height
            
            CustomTextInput:
                size_hint_y: None
                height: 50
            Button:
                text: 'press me'
                size_hint_y: None
                height: 50
            Widget:
                size_hint_y: None
                height: 400

内容的提问来源于stack exchange,提问作者CodeSlice Kivy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:05:55