如何禁用Android键盘仅显示Kivy键盘及解决相关自定义问题
Kivy Android平台键盘问题解决方案
问题1:禁用Android系统键盘,仅保留Kivy键盘
要解决Android系统键盘与Kivy键盘同时弹出的问题,需从Kivy配置和Android打包配置两个层面调整:
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()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
相关产品推荐
相关产品推荐

