【免费下载链接】KeyboardEasy keyboard for inserting all kinds of texts, special characters and numbers.项目地址https://gitcode.com/gh_mirrors/keyboard2/Keyboard点击查看免费下载Fossify Keyboard 是一款完全离线、注重隐私的开源 Android 输入法支持多种语言布局、内置剪贴板、表情面板与深色主题。它最核心的实现就是一个继承自 Android 系统类InputMethodService的服务——本文将带你从源码层面拆解Fossify Keyboard 的 InputMethodService 输入服务生命周期看懂一个自定义键盘从注册、启动到把按键变成文字的完整链路。一、InputMethodService键盘应用的心脏在 Android 里所有第三方输入法都必须实现一个InputMethodService。系统输入法管理器 IMS会负责启动、绑定和切换它而键盘 UI 与逻辑全部由开发者自己写。Fossify Keyboard 的核心就集中在一个文件里输入服务入口SimpleKeyboardIME.ktclass SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener { ... }它同时实现了OnKeyboardActionListener接口见 OnKeyboardActionListener.kt这样键盘视图在捕捉到触摸后就能通过onPress、onKey、onActionUp等回调把事件交还给服务本身处理。简单记忆Service 管状态与文字View 管显示与触摸两者靠监听器接口互相回调。二、服务注册两步声明缺一不可要让系统识别出这是一个输入法Fossify Keyboard 做了两件标准动作。1. 在清单中声明service在 AndroidManifest.xml 中服务被声明并绑定了一个特殊的元数据service android:name.services.SimpleKeyboardIME android:exportedtrue android:permissionandroid.permission.BIND_INPUT_METHOD meta-data android:nameandroid.view.im android:resourcexml/method / intent-filter action android:nameandroid.view.InputMethod / /intent-filter /service其中BIND_INPUT_METHOD权限和android.view.InputMethod动作告诉系统这是一个输入方法而meta-data指向的描述文件才是真正的身份证。2. 编写输入法描述文件method.xmlmethod.xml 定义了输入法的图标、设置页与子类型input-method android:iconmipmap/ic_launcher android:settingsActivityorg.fossify.keyboard.activities.SettingsActivity android:supportsInlineSuggestionstrue subtype android:imeSubtypeModeKeyboard / /input-methodsettingsActivity决定了用户点输入法设置时跳转到哪里对应 SettingsActivity.kt。三、生命周期从创建到按键的完整链路InputMethodService提供了一系列回调Fossify Keyboard 按需重写了其中关键的几个它们共同构成了键盘的一生回调方法触发时机主要职责onInitializeInterface键盘框架初始化后注册设置变化监听实现改设置即时生效onCreateInputView需要显示键盘 UI 时构建并返回键盘视图树onStartInput聚焦到某个输入框时读取输入类型、构建对应键盘onStartInputView键盘视图显示后应用背景色、适配刘海屏onKey用户按下按键时把按键码转换为文字并写入输入框1. 构建键盘视图onCreateInputViewoverride fun onCreateInputView(): View { binding KeyboardViewKeyboardBinding.inflate(layoutInflater) keyboardView binding.keyboardView.apply { setKeyboard(keyboard!!) setEditorInfo(currentInputEditorInfo) setupEdgeToEdge() mOnKeyboardActionListener thisSimpleKeyboardIME } return binding.root }它把布局 keyboard_view_keyboard.xml 膨胀成视图树。这个布局里包含工具栏、表情面板、剪贴板面板以及真正负责按键显示的自定义视图MyKeyboardView见 MyKeyboardView.kt。注意最后把mOnKeyboardActionListener指向了自己——这就是视图回调服务的接线点。2. 感知输入框onStartInput每当用户聚焦到某个输入框系统都会回调它。Fossify Keyboard 在这里判断输入框类型动态切换键盘布局override fun onStartInput(attribute: EditorInfo?, restarting: Boolean) { inputTypeClass attribute!!.inputType and TYPE_MASK_CLASS enterKeyType attribute.imeOptions and (IME_MASK_ACTION or IME_FLAG_NO_ENTER_ACTION) keyboard createNewKeyboard() keyboardView?.setKeyboard(keyboard!!) ... }createNewKeyboard()会根据输入类型选择不同的布局资源数字框用keys_numbers、电话框用keys_phone、日期框用符号键盘其余默认用字母键盘。这就是为什么在数字输入框里键盘会自动变成数字布局。四、从按键到文字触摸、回调与 commitText1. 视图负责点中了哪个键MyKeyboardView在onTouchEvent中把触摸坐标映射到具体按键找到后调用监听器。核心逻辑非常简洁private fun getPressedKeyIndex(x: Int, y: Int): Int { return mKeys.indexOfFirst { it.isInside(x, y) } } private fun detectAndSendKey(index: Int, x: Int, y: Int, eventTime: Long) { if (index ! NOT_A_KEY index in mKeys.indices) { mOnKeyboardActionListener!!.onKey(mKeys[index].code) } }isInside(x, y)是MyKeyboard.Key里的几何判定见 MyKeyboard.kt它判断坐标是否落在按键矩形内。命中后就把按键码code通过onKey传回给服务。2. 服务负责把键变成字服务的onKey是真正的输入引擎。它拿到currentInputConnection通往输入框的桥梁再根据按键码决定写文字、删字符还是执行回车override fun onKey(code: Int) { val inputConnection currentInputConnection when (code) { MyKeyboard.KEYCODE_DELETE - { inputConnection.deleteSurroundingText(count, 0) // 退格 } MyKeyboard.KEYCODE_ENTER - { inputConnection.performEditorAction(imeOptionsActionId) // 回车/搜索/发送 } else - { inputConnection.commitText(codeChar.toString(), 1) // 提交字符 updateShiftKeyState() } } }其中commitText是关键 API它把字符串插入到光标处是键盘与输入框之间最核心的通信方式。退格键则用deleteSurroundingText删除回车键用performEditorAction触发搜索/发送等动作。3. 键盘数据来自 XMLMyKeyboard在构造时会解析一份布局 XML如 keys_letters_english_qwerty.xml把Row、Key标签逐行逐键读进内存算出每个键的坐标、宽高与按键码。这也意味着想新增一种语言或键盘布局往往只需再写一份 XML这也是 Fossify Keyboard 支持几十种语言的秘诀。五、动态响应让设置改完即生效键盘是一个长期存活的组件用户随时可能去改主题、换语言。Fossify Keyboard 在onInitializeInterface里注册了设置监听一旦相关键值变化就立即刷新视图override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { if (key in arrayOf(SHOW_KEY_BORDERS, KEYBOARD_LANGUAGE, HEIGHT_PERCENTAGE, ...)) { keyboardView?.setupKeyboard() updateBackgroundColors() } }配合onUpdateSelection光标/选区变化时刷新 Shift 状态键盘始终能跟上输入框的最新状态。这套监听 即时重建的思路是自定义InputMethodService里很值得借鉴的工程实践。小结回顾 Fossify Keyboard 对InputMethodService的使用可以总结出一条清晰的主线注册AndroidManifest.xmlmethod.xml向系统声明我是一名输入法创建onCreateInputView搭好键盘视图并把监听器指向自身启动onStartInput读取输入框类型构建匹配的语言/数字键盘输入MyKeyboardView命中按键 →onKey回调 →commitText写入文字响应设置监听 选区更新让键盘始终保持最新状态理解这条生命周期链路你就掌握了 Android 自定义键盘最核心的骨架无论是移植功能还是开发自己的输入法都能从 Fossify Keyboard 这份清晰、克制的源码里获得大量参考。赞分享【免费下载链接】KeyboardEasy keyboard for inserting all kinds of texts, special characters and numbers.项目地址https://gitcode.com/gh_mirrors/keyboard2/Keyboard点击查看免费下载相关推荐prompt-ops前端界面详解轻松掌握可视化优化工具prompt ops前端界面详解轻松掌握可视化优化工具 prompt ops是一款开源的LLM提示词优化工具通过直观的前端界面帮助用户轻松实现提示词的可视化Rust实现原理全揭秘Pitchfork Supervisor、IPC与进程生命周期源码剖析Rust实现原理全揭秘Pitchfork Supervisor、IPC与进程生命周期源码剖析 Pitchfork 是一个用 Rust 编写的本地守护进程管理工Fossify Keyboard 40 语言键盘布局实测QWERTY、AZERTY 到 Dvorak 全解析Fossify Keyboard 40 语言键盘布局实测QWERTY、AZERTY 到 Dvorak 全解析 Fossify Keyboard 是一款完全开上一篇RepoBrain rb-ask实战如何问出带文件路径行号的地面化代码答案下一篇如何写出你的第一个酒馆脚本JS-Slash-Runner 脚本库、编辑器与导入导出全流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考