type
Post
status
Published
date
Jun 23, 2025
slug
2025/06/23/Practice-of-Customizing-Fcitx5-Android-Keyboard-Layout-Based-on-the-Modified-Version-by-fxliang
summary
tags
Fcitx5
rime
category
Rime
created days
new update day
icon
password
Created_time
Jun 23, 2025 01:54 PM
Last edited time
Jun 24, 2025 01:14 AM

🔧 背景介绍

众所周知,小企鹅输入法(Fcitx5 for Android,简称 f5a)在体验方面表现优秀,尤其是对 Rime 的支持非常稳定。但有一个长期未解决的问题:官方版本并不支持用户自定义按键布局
想要自定义键盘(比如调整键位、长按符号、符号面板等),就必须:
  1. 修改源码;
  1. 编译生成 APK;
  1. 安装测试,每次调整都要重复这些步骤。
这不仅耗时耗力,而且门槛较高。

🎉 新发现:支持 JSON 自定义的修改版 f5a

幸运的是,近期由 fxliang 大佬 制作的 f5a 修改版本 实现了键盘布局的 JSON 自定义功能,极大降低了定制成本。
该版本支持读取特定的 JSON 文件,直接控制主键盘布局和长按弹出的符号菜单——无需编译源码!

🚀 快速上手:一步步教你定制键盘

1. 下载修改版 Fcitx5 Android

前往项目发布页下载:
你需要下载两个 APK:
  • 主程序(fcitx5-android)
  • Rime 插件(fcitx5-rime)
notion image
💡
⚠️ 注意:
  • 安装之前,请卸载原来的官方版本 f5a!
  • 记得提前备份用户数据!
  • 导出的数据也可以导入到 fxliang 的版本中使用。

2. 安装完成后,创建配置文件

安装完毕插件之后,打开用户数据目录,新建两个文件 config/PopupPreset.jsonconfig/TextKeyboardLayout.json
代表在 config 目录下新建 PopupPreset.json (管理长按弹出的符号)与 TextKeyboardLayout.json (管理主键盘布局)这两个文件。
config/PopupPreset.json config/TextKeyboardLayout.json

3. 修改生效方式

💡
在正式修改之前,需要明确提示一下,你的配置文件的生效方式:
每次修改完 JSON 文件后,需要:
  1. 切换到另一个输入法;
  1. 再切换回 f5a(梁佬版);
这样 f5a 才会重新加载配置文件,更新键盘布局。

4. 修改定制主键盘

点击查看 TextKeyboardLayout.json 默认示例
[ [ {"type": "AlphabetKey", "main": "Q", "alt": "1"}, {"type": "AlphabetKey", "main": "W", "alt": "2"}, {"type": "AlphabetKey", "main": "E", "alt": "3"}, {"type": "AlphabetKey", "main": "R", "alt": "4"}, {"type": "AlphabetKey", "main": "T", "alt": "5"}, {"type": "AlphabetKey", "main": "Y", "alt": "6"}, {"type": "AlphabetKey", "main": "U", "alt": "7"}, {"type": "AlphabetKey", "main": "I", "alt": "8"}, {"type": "AlphabetKey", "main": "O", "alt": "9"}, {"type": "AlphabetKey", "main": "P", "alt": "0"} ], [ {"type": "AlphabetKey", "main": "A", "alt": "@"}, {"type": "AlphabetKey", "main": "S", "alt": "*"}, {"type": "AlphabetKey", "main": "D", "alt": "+"}, {"type": "AlphabetKey", "main": "F", "alt": "-"}, {"type": "AlphabetKey", "main": "G", "alt": "="}, {"type": "AlphabetKey", "main": "H", "alt": "/"}, {"type": "AlphabetKey", "main": "J", "alt": "#"}, {"type": "AlphabetKey", "main": "K", "alt": "("}, {"type": "AlphabetKey", "main": "L", "alt": ")"} ], [ {"type": "CapsKey"}, {"type": "AlphabetKey", "main": "Z", "alt": "'"}, {"type": "AlphabetKey", "main": "X", "alt": ":"}, {"type": "AlphabetKey", "main": "C", "alt": "\""}, {"type": "AlphabetKey", "main": "V", "alt": "?"}, {"type": "AlphabetKey", "main": "B", "alt": "!"}, {"type": "AlphabetKey", "main": "N", "alt": "~"}, {"type": "AlphabetKey", "main": "M", "alt": "\\"}, {"type": "BackspaceKey"} ], [ {"type": "LayoutSwitchKey", "label": "?123", "subLabel": ""}, {"type": "CommaKey", "weight": 0.1}, {"type": "LanguageKey"}, {"type": "SpaceKey"}, {"type": "SymbolKey", "label": ".", "weight": 0.1}, {"type": "ReturnKey"} ] ]
你可以按以下示例格式进行修改和尝试。JSON 中的 key 值以及对应的具体效果,你可以通过下面的几张截图与演示进行了解。
  • main:实际输入内容;
  • displayText:按键上显示的文字(可与输入内容不同);
  • alt:下滑输入的符号(如数字、符号、在键盘上下角按键显示的小符号);
  • 其他类型的按键如 CapsKeyBackspaceKey 等代表特殊功能键。
在这里我进行了两种的修改测试,一种是修改 main 一种是修改 displayText
  1. 修改 main,这个时候上屏的就是
修改 main key
notion image
切换输入法触发配置加载
notion image
上屏测试
  1. 修改 displayText 只影响显示,不影响实际按键发送的值。
修改 displayText
notion image
切换输入法重载配置
notion image
上屏测试

5. 修改定制长按弹出

💡
注意:弹出是区分大小写的,如果你修改后发现没有生效,请确认是否修改了正确的部分!
点击查看 PopupPreset.json 默认示例
{ "q": ["1", "Q", "ɋ"], "w": ["2", "W"], "e": ["3", "E", "ê", "ë", "ē", "é", "ě", "è", "ė", "ę", "ȩ", "ḝ", "ə"], "r": ["4", "R", "$"], "t": ["5", "T", "%"], "y": ["6", "Y", "ÿ", "ұ", "ү", "ӯ", "ў"], "u": ["7", "&", "U", "û", "ü", "ū", "ú", "ǔ", "ù"], "i": ["8", "I", "î", "ï", "ī", "í", "ǐ", "ì", "į", "ı"], "o": ["9", "O", "ô", "ö", "ō", "ó", "ǒ", "ò", "œ", "ø", "õ"], "p": ["0", "P"], "a": ["@", "A", "â", "ä", "ā", "á", "ǎ", "à", "æ", "ã", "å"], "s": ["*", "S", "ß", "ś", "š", "ş"], "d": ["+", "D", "ð"], "f": ["-", "F", "_"], "g": ["=", "G", "ğ"], "h": ["/", "H"], "j": ["#", "J"], "k": ["(", "[", "{", "K"], "l": [")", "]", "}", "L", "ł"], "z": ["'", "Z", "`", "ž", "ź", "ż"], "x": [":", "X", "×", ";"], "c": ["\"", "|", "C", "ç", "ć", "č"], "v": ["?", "V", "¿", "ü", "ǖ", "ǘ", "ǚ", "ǜ"], "b": ["!", "B", "¡"], "n": ["~", "N", "ñ", "ń"], "m": ["\\", "M"], "Q": ["1", "q"], "W": ["2", "w"], "E": ["3", "e", "Ê", "Ë", "Ē", "É", "È", "Ė", "Ę", "Ȩ", "Ḝ", "Ə"], "R": ["4", "r"], "T": ["5", "t"], "Y": ["6", "y", "Ÿ", "Ұ", "Ү", "Ӯ", "Ў"], "U": ["7", "&", "u", "Û", "Ü", "Ù", "Ú", "Ū"], "I": ["8", "i", "Î", "Ï", "Í", "Ī", "Į", "Ì"], "O": ["9", "o", "Ô", "Ö", "Ò", "Ó", "Œ", "Ø", "Ō", "Õ"], "P": ["0", "p"], "A": ["@", "a", "Â", "Ä", "Ā", "Á", "À", "Æ", "Ã", "Å"], "S": ["*", "s", "ẞ", "Ś", "Š", "Ş"], "D": ["+", "d", "Ð"], "F": ["-", "f", "_"], "G": ["=", "g", "Ğ"], "H": ["/", "h"], "J": ["#", "j"], "K": ["(", "k"], "L": [")", "l", "Ł"], "Z": ["'", "z", "`", "Ž", "Ź", "Ż"], "X": [":", "x"], "C": ["\"", "c", "Ç", "Ć", "Č"], "V": ["?", "v"], "B": ["!", "b", "¡"], "N": ["~", "n", "Ñ", "Ń"], "M": ["\\", "m"], "г": ["ғ"], "е": ["ё"], "и": ["ӣ", "і"], "й": ["ј"], "к": ["қ", "ҝ"], "н": ["ң", "һ"], "о": ["ә", "ө"], "ч": ["ҷ", "ҹ"], "ь": ["ъ"], "Г": ["Ғ"], "Е": ["Ё"], "И": ["Ӣ", "І"], "Й": ["Ј"], "К": ["Қ", "Ҝ"], "Н": ["Ң", "Һ"], "О": ["Ә", "Ө"], "Ч": ["Ҷ", "Ҹ"], "Ь": ["Ъ"], "ا": ["أ", "إ", "آ", "ء"], "ب": ["پ"], "ج": ["چ"], "ز": ["ژ"], "ف": ["ڤ"], "ك": ["گ"], "ل": ["لا"], "ه": ["ه"], "و": ["ؤ"], "ג": ["ג׳"], "ז": ["ז׳"], "ח": ["ח׳"], "צ׳": ["צ׳"], "ת": ["ת׳"], "י": ["ײַ"], "ח": ["ױ"], "ו": ["װ"], "0": ["∅", "ⁿ", "⁰"], "1": ["¹", "½", "⅓", "¼", "⅕", "⅙", "⅐", "⅛", "⅑", "⅒"], "2": ["²", "⅖", "⅔"], "3": ["³", "⅗", "¾", "⅜"], "4": ["⁴", "⅘", "⅝", "⅚"], "5": ["⁵", "⅝", "⅚"], "6": ["⁶"], "7": ["⁷", "⅞"], "8": ["⁸"], "9": ["⁹"], ".": [",", "?", "!", ":", ";", "_", "%", "$", "^", "&"], "-": ["—", "–", "·"], "?": ["¿", "‽"], "'": ["‘", "’", "‚", "›", "‹"], "!": ["¡"], "\"": ["“", "”", "„", "»", "«"], "/": ["÷"], "#": ["№"], "%": ["‰", "℅"], "^": ["↑", "↓", "←", "→"], "+": ["±"], "<": ["≤", "«", "‹", "⟨"], "=": ["∞", "≠", "≈"], ">": ["≥", "»", "›", "⟩"], "°": ["′", "″", "‴"], "$": ["¢", "€", "£", "¥", "₹", "₽", "₺", "₩", "₱", "₿"], "🤚": ["✋🏻", "✋🏼", "✋🏽", "✋🏾", "✋🏿"] }

📌 小结

fxliang 的这个改动非常实用,让 Android 上的 Fcitx5 输入法第一次具备了“无需编译即可自定义键盘布局”的能力。对于重度输入法用户、自定义需求较高的 Rime 用户来说,是一个质的提升。
建议结合 Rime 的同步机制(例如导入包工具)和这个修改版的键盘定制,一起使用,打造一个完全可控、高度定制的移动输入体验。

感谢

非常感谢 fxliang 佬的改版项目
 
欢迎加入喵星计算机技术研究院,原创技术文章第一时间推送。
notion image
 
阿里云主机无法启动下的完整数据恢复方案Fcitx5 for Android 方案导入包生成工具