{"id":18565076,"url":"https://github.com/jenly1314/kingkeyboard","last_synced_at":"2025-04-07T10:27:54.590Z","repository":{"id":42200369,"uuid":"234290343","full_name":"jenly1314/KingKeyboard","owner":"jenly1314","description":":musical_keyboard: KingKeyboard 是一个自定义键盘。内置了满足各种场景的键盘需求：包括但不限于混合、字母、数字、电话、身份证、车牌号等可输入场景。还支持自定义。集成简单，键盘可定制化。","archived":false,"fork":false,"pushed_at":"2024-06-20T10:26:59.000Z","size":10784,"stargazers_count":260,"open_issues_count":1,"forks_count":37,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-31T08:11:16.809Z","etag":null,"topics":["android","custom-keyboard","idcard-keyboard","identity-keyboard","input-method","inputmethod","keyboard","keyboards","keycode","kotlin","letter-keyboard","license-plate","license-plate-keyboard","number-keyboard","plate-number","vehicle-keyboard"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jenly1314.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-01-16T10:03:31.000Z","updated_at":"2025-03-29T03:03:28.000Z","dependencies_parsed_at":"2024-06-21T00:00:52.645Z","dependency_job_id":"f55230de-f526-4ca1-9072-1a7ae2477f39","html_url":"https://github.com/jenly1314/KingKeyboard","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenly1314%2FKingKeyboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenly1314%2FKingKeyboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenly1314%2FKingKeyboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenly1314%2FKingKeyboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jenly1314","download_url":"https://codeload.github.com/jenly1314/KingKeyboard/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247634736,"owners_count":20970593,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","custom-keyboard","idcard-keyboard","identity-keyboard","input-method","inputmethod","keyboard","keyboards","keycode","kotlin","letter-keyboard","license-plate","license-plate-keyboard","number-keyboard","plate-number","vehicle-keyboard"],"created_at":"2024-11-06T22:17:36.460Z","updated_at":"2025-04-07T10:27:54.583Z","avatar_url":"https://github.com/jenly1314.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# KingKeyboard\n\n![Image](app/src/main/ic_launcher-web.png)\n\n[![Download](https://img.shields.io/badge/download-App-blue.svg)](https://raw.githubusercontent.com/jenly1314/KingKeyboard/master/app/release/app-release.apk)\n[![MavenCentral](https://img.shields.io/maven-central/v/com.github.jenly1314/kingkeyboard)](https://repo1.maven.org/maven2/com/github/jenly1314/kingkeyboard)\n[![JitPack](https://jitpack.io/v/jenly1314/KingKeyboard.svg)](https://jitpack.io/#jenly1314/KingKeyboard)\n[![CircleCI](https://circleci.com/gh/jenly1314/KingKeyboard.svg?style=svg)](https://circleci.com/gh/jenly1314/KingKeyboard)\n[![API](https://img.shields.io/badge/API-21%2B-blue.svg?style=flat)](https://android-arsenal.com/api?level=21)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/mit-license.php)\n\n**KingKeyboard** 是一款灵活好用的自定义键盘，内置多种智能预设模式（包括字母、数字、电话、身份证、车牌号等专用键盘），同时支持完全自定义，轻松满足各种输入场景需求。\n\n## 功能特色\n- 🎯 **开箱即用：** 内置多种预设键盘，轻松应对各类输入场景\n- 🛠️ **深度定制：** 支持完全自定义，满足个性化需求\n- 🚀 **极简集成：** 提供简洁的API，可快速接入\n- 🎨 **舒适视觉：** 专业设计师精心调校的配色方案，兼顾美学表现与实用体验\n\n## Gif 展示\n![Image](GIF.gif)\n\n\u003e 你也可以直接下载 [演示App](https://raw.githubusercontent.com/jenly1314/KingKeyboard/master/app/release/app-release.apk) 体验效果\n\n## 引入\n\n### Gradle:\n\n1. 在Project的 **build.gradle** 或 **setting.gradle** 中添加远程仓库\n\n    ```gradle\n    repositories {\n        //...\n        mavenCentral()\n    }\n    ```\n\n2. 在Module的 **build.gradle** 中添加依赖项\n\n    ```gradle\n    implementation 'com.github.jenly1314:kingkeyboard:1.1.0'\n    ```\n\n## 使用\n\n### 键盘类型说明\n\n`KingKeyboard.KeyboardType` 定义了多种键盘类型枚举，使用前请先熟悉这些类型，这是正确集成 `KingKeyboard` 的重要前提。\n\n```Kotlin\n/**\n * 默认键盘 - 数字 + 字母 + 符号\n */\nKeyboardType.NORMAL\n/**\n * 字母键盘\n */\nKeyboardType.LETTER\n/**\n * 仅小写字母键盘\n */\nKeyboardType.LOWERCASE_LETTER_ONLY\n/**\n * 仅大写字母键盘\n */\nKeyboardType.UPPERCASE_LETTER_ONLY\n/**\n * 字母 + 数字键盘\n */\nKeyboardType.LETTER_NUMBER\n/**\n * 数字键盘\n */\nKeyboardType.NUMBER\n/**\n * 浮点数键盘（数字加“.”符号）\n */\nKeyboardType.NUMBER_DECIMAL\n/**\n * 电话拨号键盘（数字加“-”符号）\n */\nKeyboardType.PHONE\n/**\n * 身份证键盘\n */\nKeyboardType.ID_CARD\n/**\n * 车牌键盘 - 车牌 -\u003e 归属地 + 切换车牌号（包含不常见的一些特殊车牌）\n */\nKeyboardType.LICENSE_PLATE\n/**\n * 车牌键盘 - 车牌（不包含一些少见的特殊车牌），如需要更全的可以使用[LICENSE_PLATE]\n */\nKeyboardType.LICENSE_PLATE_PROVINCE\n/**\n * 预留自定义键盘类型\n */\nKeyboardType.CUSTOM\n/**\n * 预留自定义键盘类型 - 键盘模式切换\n */\nKeyboardType.CUSTOM_MODE_CHANGE\n/**\n * 预留自定义键盘类型 - 更多\n */\nKeyboardType.CUSTOM_MORE\n\n```\n\u003e 最后面几个定义的`CUSTOM`开头的键盘类型是预留给自定义键盘使用的，当上面内置的键盘类型不满足你的需求时，你可以通过预留的自定义键盘类型，来便捷定制你的自定义键盘。\n\n### 基本使用\n\n#### 使用示例\n```Kotlin\n    // 初始化KingKeyboard\n    kingKeyboard = KingKeyboard(this, keyboardParent)\n    // 然后将EditText注册到KingKeyboard即可\n    kingKeyboard.register(editText, KingKeyboard.KeyboardType.NUMBER)\n```\n* 注意：示例中初始化时的`keyboardParent`参数可为空或省略，但若遇到输入时`EditText`被键盘遮挡的问题，通常是由于布局层级不当导致。\n\u003e 推荐方案：在布局中添加一层可滚动视图（如：`ScrollView`）包裹内容区域，同时将`keyboardParent`与`ScrollView`置于同一层级并固定在底部。这样可确保键盘弹出时内容自动滚动，避免遮挡输入框。（完整实现可参考 [app](app) 中的示例代码）\n\n在`Activity`或`Fragment`相应的生命周期中调用，如下所示\n\n```Kotlin\n    override fun onResume() {\n        super.onResume()\n        kingKeyboard.onResume()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        kingKeyboard.onDestroy()\n    }\n\n```\n\u003e 从 **v1.1.0** 版本开始，`KingKeyboard`实现了`LifecycleObserver`；如果是通过`Activity`实例化的`KingKeyboard`，\n\u003e `KingKeyboard`会在初始化时内部调用`activity.lifecycle.addObserver(this)`；可以不用主动在生命周期中调用`kingKeyboard.onResume()`和`kingKeyboard.onDestroy()`了。\n\n好了，到这里`KingKeyboard`键盘的基本使用你已经学会了，是不是很简单？\n\u003e 如果以上已经能满足你的需求，可以不用往下看了。\n\n---\n\n从分割线开始，下面是关于 **KingKeyboard** 键盘更细节的一些说明\n\n---\n\n### 键盘配置\n\n```Kotlin\n    // 获取键盘相关的配置信息\n    val config = kingKeyboard.getKeyboardViewConfig()\n\n    //... 修改一些键盘的配置信息\n    // config.keyTextColor = ContextCompat.getColor(context, R.color.king_keyboard_key_text_color)\n\n    // 重新设置键盘配置信息\n    kingKeyboard.setKeyboardViewConfig(config)\n\n    // 按键是否启用震动\n    kingKeyboard.setVibrationEffectEnabled(isVibrationEffectEnabled)\n\n    //... 还有各种监听方法。更多详情，请直接使用。\n\n```\n\u003e 也可通过资源覆盖的方式，统一修改键盘配置。（`KingKeyboard`中的所有资源均以`king_keyboard`开头）\n\n### 键盘状态\n\n通过`kingKeyboard.isShow()`可以判断键盘是否显示，通过调用`kingKeyboard.hide()` 主动隐藏键盘。\n\n```Kotlin\n    /**\n     * 键盘是否显示\n     */\n    kingKeyboard.isShow()\n\n    /**\n     * 隐藏键盘\n     */\n    kingKeyboard.hide()\n\n```\n\u003e 不对外提供`kingKeyboard.show()`函数的原因是：`KingKeyboard`内部已经根据`EditText`的焦点状态处理了键盘的显示时机。\n\n### 键盘控制：代码发送键值（v1.0.2新增）\n\n有时，我们会有动态控制键盘的需求；这时你就可以使用 `kingKeyboard.sendKey(primaryCode)` 来发送键值操控键盘了。\n\n```kotlin\n    var beforeCount = 0\n\n    kingKeyboard.register(et,KingKeyboard.KeyboardType.LICENSE_PLATE_PROVINCE)\n\n    //通过监听输入框内容改变，来通过发送功能键来切换键盘（这里只是举例展示kingKeyboard.sendKey的用法，具体怎么用还需根据需求场景去决定）\n    et.addTextChangedListener(object : TextWatcher{\n        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {\n            beforeCount = s?.length ?: 0\n        }\n\n        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {\n            when(s?.length){\n                0 -\u003e {//车牌键盘：如果输入的内容长度改变为0，并且当前的键盘不是省份键盘模式时，通过发送“返回”功能按键值，让键盘自动切换到省份键盘模式\n                    if(kingKeyboard.getKeyboardType() != KingKeyboard.KeyboardType.LICENSE_PLATE_PROVINCE){\n                        kingKeyboard.sendKey(KingKeyboard.KEYCODE_BACK)\n                    }\n                }\n                1 -\u003e {//车牌键盘：如果输入的内容长度从0改变为1，并且当前的键盘为省份键盘模式时，通过发送“模式改变”功能按键值，让键盘自动切换到字母键盘模式\n                    if(beforeCount == 0 \u0026\u0026 kingKeyboard.getKeyboardType() == KingKeyboard.KeyboardType.LICENSE_PLATE_PROVINCE){\n                        kingKeyboard.sendKey(KingKeyboard.KEYCODE_MODE_CHANGE)\n                    }\n                }\n            }\n        }\n\n        override fun afterTextChanged(s: Editable?) {\n\n        }\n\n    })\n```\n\u003e 根据 `primaryCode` 发送按键事件，可通过调用触发去执行按键值对应的功能（仅限功能键） 特别说明：之所以仅限功能键，是因为如果对外支持输入相关的按键值，会破坏输入内容的限制。\n\n### 自定义键盘\n\n如果目前所支持的键盘满足不了你的需求，你也可以自定义键盘，`KingKeyboard`对外提供自定义键盘类型。\n\n**`KeyboardType` 中预留的自定义键盘类型**\n\n| 键盘类型                           | 设置布局方法                                       | 说明 |\n|----------------------------------|----------------------------------------------|------|\n| `CUSTOM`            | `kingKeyboard.setKeyboardCustom()`           | 自定义键盘 |\n| `CUSTOM_MODE_CHANGE` | `kingKeyboard.setKeyboardCustomModeChange()` | 自定义键盘 - 模式切换 |\n| `CUSTOM_MORE`       | `kingKeyboard.setKeyboardCustomMore()`       | 自定义键盘 - 更多 |\n\n\u003e 自定义键盘步骤也非常简单，你只需自定义键盘的xml布局，然后将`EditText`注册到对应的自定义键盘类型即可。\n\n#### 自定义键盘代码示例\n\n```Kotlin\n    // 初始化KingKeyboard\n    kingKeyboard = KingKeyboard(this, keyboardParent)\n    // 设置自定义键盘布局\n    kingKeyboard.setKeyboardCustom(R.xml.keyboard_custom)\n    // 然后将EditText注册到KingKeyboard即可\n    kingKeyboard.register(editText, KingKeyboard.KeyboardType.CUSTOM)\n```\n\u003e 示例中的[`R.xml.keyboard_custom`](app/src/main/res/xml/keyboard_custom.xml) 为自定义键盘布局的xml资源文件，其中包含键盘布局和键值码等相关信息。\n\n#### 自定义按键值说明\n\n在`KingKeyboard`的伴生对象中定义了一些核心的按键值，当你需要自定义键盘时，可能需要用到\n\n```Kotlin\n\n    //------------------------------ 下面是定义的一些公用功能按键值\n    /**\n     * Shift键 -\u003e 一般用来切换键盘大小写字母\n     */\n    const val KEYCODE_SHIFT = -1\n    /**\n     * 模式改变 -\u003e 切换键盘输入法\n     */\n    const val KEYCODE_MODE_CHANGE = -2\n    /**\n     * 取消键 -\u003e 关闭输入法\n     */\n    const val KEYCODE_CANCEL = -3\n    /**\n     * 完成键 -\u003e 长出现在右下角蓝色的完成按钮\n     */\n    const val KEYCODE_DONE = -4\n    /**\n     * 删除键 -\u003e 删除输入框内容\n     */\n    const val KEYCODE_DELETE = -5\n    /**\n     * Alt键 -\u003e 预留，暂时未使用\n     */\n    const val KEYCODE_ALT = -6\n    /**\n     * 空格键\n     */\n    const val KEYCODE_SPACE = 32\n\n    /**\n     * 无作用键 -\u003e 一般用来占位或者禁用按键\n     */\n    const val KEYCODE_NONE = 0\n\n    //------------------------------\n\n    /**\n     * 键盘按键 -\u003e 返回（返回，适用于切换键盘后界面使用，如：NORMAL_MODE_CHANGE或CUSTOM_MODE_CHANGE键盘）\n     */\n    const val KEYCODE_MODE_BACK = -101\n\n    /**\n     * 键盘按键 -\u003e返回（直接返回到最初,直接返回到NORMAL或CUSTOM键盘）\n     */\n    const val KEYCODE_BACK = -102\n\n    /**\n     * 键盘按键 -\u003e更多\n     */\n    const val KEYCODE_MORE = -103\n\n    //------------------------------ 下面是自定义的一些预留按键值，与共用按键功能一致,但会使用默认的背景按键\n\n    const val KEYCODE_KING_SHIFT = -201\n    const val KEYCODE_KING_MODE_CHANGE = -202\n    const val KEYCODE_KING_CANCEL = -203\n    const val KEYCODE_KING_DONE = -204\n    const val KEYCODE_KING_DELETE = -205\n    const val KEYCODE_KING_ALT = -206\n\n    //------------------------------ 下面是自定义的一些功能按键值，与共用按键功能一致,但会使用默认背景颜色\n\n    /**\n     * 键盘按键 -\u003e 返回（返回，适用于切换键盘后界面使用，如：NORMAL_MODE_CHANGE或CUSTOM_MODE_CHANGE键盘）\n     */\n    const val KEYCODE_KING_MODE_BACK = -251\n\n    /**\n     * 键盘按键 -\u003e返回（直接返回到最初,直接返回到NORMAL或CUSTOM键盘）\n     */\n    const val KEYCODE_KING_BACK = -252\n\n    /**\n     * 键盘按键 -\u003e更多\n     */\n    const val KEYCODE_KING_MORE = -253\n\n    /*\n        用户也可自定义按键值，primaryCode范围区间为-999 ~ -300时，表示预留可扩展按键值。\n        其中-399~-300区间为功能型按键，使用Special背景色，-999~-400自定义按键为默认背景色\n    */\n\n```\n\n更多使用详情，请查看[app](app)中的源码使用示例或直接查看[API帮助文档](https://jenly1314.github.io/KingKeyboard/api/)\n\n## 相关推荐\n\n* [SplitEditText](https://github.com/jenly1314/SplitEditText) 一个灵活的分割可编辑框；常常应用于 **验证码输入** 、**密码输入** 等场景。\n* [CodeTextField](https://github.com/jenly1314/CodeTextField) 一个使用 Compose 实现的验证码输入框。\n\n\u003c!-- end --\u003e\n\n## 版本日志\n\n#### v1.1.0：2025-4-6\n* 更新gradle至v8.0\n* 更新compileSdk至32\n* 更新kotlin至v1.8.10\n* `KingKeyboard`实现`LifecycleObserver`（构造中的`Activity`改为`ComponentActivity`）\n* 优化Java调用Kotlin默认参数函数时的兼容性（构造添加注解：`@JvmOverloads`）\n* 调整车牌键盘按键的排列顺序\n* 优化点击音效和振动触感反馈实现方式\n* 优化键盘按键默认配置的背景（颜色搭配微调，使整体看起来更美观）\n* 优化一些细节\n\n#### [查看更多版本日志](CHANGELOG.md)\n\n## 赞赏\n如果你喜欢KingKeyboard，或感觉KingKeyboard帮助到了你，可以点右上角“Star”支持一下，你的支持就是我的动力，谢谢 :smiley:\n\u003cp\u003e你也可以扫描下面的二维码，请作者喝杯咖啡 :coffee:\n\n\u003cdiv\u003e\n   \u003cimg src=\"https://jenly1314.github.io/image/page/rewardcode.png\"\u003e\n\u003c/div\u003e\n\n## 关于我\n\n| 我的博客                                                                                | GitHub                                                                                  | Gitee                                                                                  | CSDN                                                                                 | 博客园                                                                            |\n|:------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------|\n| \u003ca title=\"我的博客\" href=\"https://jenly1314.github.io\" target=\"_blank\"\u003eJenly's Blog\u003c/a\u003e | \u003ca title=\"GitHub开源项目\" href=\"https://github.com/jenly1314\" target=\"_blank\"\u003ejenly1314\u003c/a\u003e | \u003ca title=\"Gitee开源项目\" href=\"https://gitee.com/jenly1314\" target=\"_blank\"\u003ejenly1314\u003c/a\u003e  | \u003ca title=\"CSDN博客\" href=\"http://blog.csdn.net/jenly121\" target=\"_blank\"\u003ejenly121\u003c/a\u003e  | \u003ca title=\"博客园\" href=\"https://www.cnblogs.com/jenly\" target=\"_blank\"\u003ejenly\u003c/a\u003e  |\n\n## 联系我\n\n| 微信公众号        | Gmail邮箱                                                                          | QQ邮箱                                                                              | QQ群                                                                                                                       | QQ群                                                                                                                       |\n|:-------------|:---------------------------------------------------------------------------------|:----------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------|\n| [Jenly666](http://weixin.qq.com/r/wzpWTuPEQL4-ract92-R) | \u003ca title=\"给我发邮件\" href=\"mailto:jenly1314@gmail.com\" target=\"_blank\"\u003ejenly1314\u003c/a\u003e | \u003ca title=\"给我发邮件\" href=\"mailto:jenly1314@vip.qq.com\" target=\"_blank\"\u003ejenly1314\u003c/a\u003e | \u003ca title=\"点击加入QQ群\" href=\"https://qm.qq.com/cgi-bin/qm/qr?k=6_RukjAhwjAdDHEk2G7nph-o8fBFFzZz\" target=\"_blank\"\u003e20867961\u003c/a\u003e | \u003ca title=\"点击加入QQ群\" href=\"https://qm.qq.com/cgi-bin/qm/qr?k=Z9pobM8bzAW7tM_8xC31W8IcbIl0A-zT\" target=\"_blank\"\u003e64020761\u003c/a\u003e |\n\n\u003cdiv\u003e\n   \u003cimg src=\"https://jenly1314.github.io/image/page/footer.png\"\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjenly1314%2Fkingkeyboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjenly1314%2Fkingkeyboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjenly1314%2Fkingkeyboard/lists"}