创建输入法| Android 开发者

文章推薦指數: 80 %
投票人數:10人

输入法(IME) 是一种可让用户输入文本的用户控件。

Android 提供了一种可扩展的输入法框架。

借助该框架,应用可以为用户提供备选输入法,例如屏幕键盘, ... 平台 AndroidStudio GooglePlay Jetpack Kotlin 文档 新闻 Language English BahasaIndonesia Deutsch Español Español–AméricaLatina Français Português–Brasil TiếngViệt Türkçe Русский ภาษาไทย 中文–简体 中文–繁體 日本語 한국어 文档 概览 指南 参考文档 示例 设计和质量 平台 AndroidStudio GooglePlay Jetpack Kotlin 文档 概览 指南 参考文档 示例 设计和质量 新闻 应用基础知识 简介 构建首个应用概览创建Android项目运行您的应用构建简单的界面启动另一个Activity 应用基础知识 应用资源概览处理配置变更 本地化本地化您的应用使用pseudolocale测试您的应用Unicode和国际化支持语言和语言区域解决方案复杂的XML资源 资源类型概览动画颜色状态列表可绘制对象布局菜单字符串样式字体更多类型 应用清单文件概览 设备 设备兼容性概览屏幕兼容性概览支持不同的屏幕尺寸支持不同的像素密度支持刘海屏声明受限屏幕支持 多APK支持概览针对不同的API级别创建多个APK针对不同的屏幕尺寸创建多个APK针对不同的GL纹理创建多个APK创建多个具有多个尺寸的APK支持不同的语言和文化支持不同的平台版本GooglePlay上的过滤器 Wear概览 向通知添加穿戴式设备功能概览创建通知通知样式通知的桥接模式保持兼容性 打造穿戴式设备应用概览打造并运行穿戴式设备应用独立应用创建自定义布局让应用保持可见状态Wear中的身份验证添加语音功能打包和分发Wear应用调试Wear应用捕获Wear界面屏幕截图打造中国版Wear应用 创建自定义界面概览定义布局创建列表显示确认退出全屏Activity使用Wear界面库Wear导航和操作实体按钮旋转输入创建输入法编辑器使用手腕手势 发送和同步数据概览网络访问和同步访问WearableDataLayer同步数据项传输资源发送和接收消息处理数据层事件将Wear应用迁移至GoogleApi 创建数据提供程序概览向复杂功能提供数据 创建表盘主题概览设计表盘主题构建表盘主题服务绘制表盘主题表盘复杂功能向复杂功能提供数据向表盘添加复杂功能创建互动式表盘提供配置Activity解决常见问题通过硬件加速提升性能优化表盘主题检测位置请求权限使用扬声器 AndroidTV概览 开发TV应用概览TV应用开发入门AndroidXTV库处理TV硬件管理TV控制器构建TV布局屏幕键盘创建TV导航在GoogleTV上提高用户互动度的最佳做法 构建TV播放应用概览创建目录浏览器提供卡片视图构建详情视图使用Leanback传输控件显示“正在播放”卡片添加引导步骤向初次使用的用户介绍您的应用启用后台播放功能 帮助用户在TV上查找内容概览 推荐TV内容概览主屏幕上的频道视频节目属性音频节目属性游戏节目属性 接下来观看添加节目属性应用开发者准则电视服务提供商准则预览视频AndroidN及更早版本中的建议使TV应用可供搜索在TV应用内进行搜索制作TV游戏 开发TV输入服务概览开发TV输入服务使用频道数据管理TV用户交互支持时移支持内容录制TV应用核对清单 TV无障碍功能非原生应用无障碍功能支持非原生应用无障碍功能最佳做法适用于TV应用的TalkBack评估示例适用于TV的Android12开发者预览版 AndroidforCars概览 开发汽车媒体应用开发汽车媒体应用添加对AndroidAuto的支持添加对AndroidAutomotiveOS的支持构建AndroidAuto即时通讯应用构建AndroidAuto导航、停车和收费应用(Beta版)测试Android汽车应用GooglePlay服务AndroidAutomotiveOS中的通知 AndroidThings概览平台差异Google服务 支持的硬件概览NXPi.MX7DRaspberryPi3 高级设置概览手动刷写映像恢复设备使用adb连接到WLAN 开发应用 创建AndroidThings应用概览创建项目连接硬件与外设互动集成外设驱动程序 与无线设备通信蓝牙LoWPAN 配置设备设置更新 与外设互动概览GPIOPWMI2CSPIUART原生PIOCLI工具集成原生代码 构建用户空间驱动程序概览位置信息输入传感器LoWPAN示例 管理设备概览创建产品配置产品 创建编译版本概览管理应用 推送更新概览自动更新监控数据分析 条款管理中心服务条款SDK许可协议AndroidThings管理中心 Chrome操作系统设备概览构建适用于Chrome操作系统的应用针对Chrome操作系统优化应用准备您的开发环境Chromebook的应用清单兼容性应用的Chrome操作系统设备支持Chromebook上的应用呈现差异窗口管理Chromebook的输入兼容性调整Chrome操作系统上的游戏在Chrome操作系统上流畅播放动画在Chrome操作系统中运行的Android应用的测试用例 核心主题 ActivityActivity简介Activity生命周期Activity状态变更测试您的Activity任务和返回栈进程和应用生命周期Parcelable和Bundle Fragment概览创建FragmentFragment管理器Fragment事务在Fragment之间添加动画过渡效果Fragment生命周期保存与Fragment相关的状态与Fragment通信使用应用栏使用DialogFragment显示对话框测试Fragment 与其他应用交互概览向另一个应用发送用户获取Activity的结果允许其他应用启动您的Activity管理软件包可见性根据用例配置软件包可见性 处理应用链接概览启用指向应用内容的链接验证应用链接为免安装应用创建应用链接加载器“最近使用的应用”屏幕多窗口支持针对从后台启动Activity的限制打造适用于可折叠设备的应用 应用快捷方式概览创建快捷方式管理快捷方式使用快捷方式的最佳做法 应用微件概览构建应用微件构建应用微件主机 应用兼容性概览兼容性框架工具针对非SDK接口的限制 架构组件概览向项目添加组件应用启动DataStore 视图绑定概览从Kotlin合成迁移到视图绑定 数据绑定库概览使用入门布局和绑定表达式使用可观察的数据对象生成的绑定类绑定适配器将布局视图绑定到架构组件双向数据绑定处理生命周期LiveData 分页库概览显示分页列表加载分页数据 Paging3概览加载并显示分页数据从网络和数据库加载页面转换数据流迁移到Paging3ViewModel WorkManager概览使用入门 方法指南定义您的WorkRequest工作状态管理工作观察工作器的中间进度将工作链接在一起测试Worker实现使用WorkManager进行集成测试调试WorkManager 高级概念配置和初始化 WorkManager中的线程处理概览用Worker处理线程用CoroutineWorker处理线程用RxWorker处理线程用ListenableWorker处理线程支持长时间运行的工作器从FirebaseJobDispatcher迁移从GCMNetworkManager迁移保存状态ViewModel的已保存状态模块将Kotlin协程与架构组件一起使用版本说明其他资源 导航组件概览导航原则使用入门创建目的地针对不同设备类型进行设计设计导航图嵌套图全局操作转到目的地条件导航在目的地之间传递数据为目标创建深层链接在目的地之间添加动画过渡效果使用NavigationUI更新界面组件KotlinDSL使用ViewPager创建包含标签页的滑动视图使用ViewPager2创建包含标签的滑动视图以编程方式进行交互使用功能模块进行导航测试导航处理配置变更添加新的目的地类型提供自定义返回导航迁移到导航组件 Intent和Intent过滤器概览常见Intent 界面概览 布局概览使用ConstraintLayout构建自适应界面 使用MotionLayout向布局中添加运动概览MotionLayout示例 MotionLayoutXML参考文档概览使用RecyclerView创建列表高级RecyclerView自定义创建卡片式布局实现自适应界面流程 改善布局性能概览优化布局层次结构通过重复使用布局视图加载延迟线性布局适配器视图相对布局 自定义视图组件概览创建自定义视图类实现自定义绘图使视图可交互优化视图 外观和风格MaterialDesign样式和主题背景深色主题背景自适应图标添加悬浮操作按钮创建阴影和剪辑视图 文本自动调整TextView的大小可下载字体XML中的字体表情符号兼容性放大镜微件Span按钮复选框单选按钮切换按钮微调框选择器提示 通知概览创建通知创建展开式通知显示有时效性的通知从通知启动Activity创建一组通知创建和管理通知渠道修改通知标志创建自定义通知对话气泡 添加应用栏概览设置应用栏添加和处理操作添加向上操作使用操作视图和操作提供程序 控制系统界面可见度概览调暗系统栏隐藏状态栏隐藏导航栏启用全屏模式响应界面可见度变更 支持滑动刷新概览为您的应用添加滑动刷新响应刷新手势消息框概览 弹出消息概览概览构建并显示弹出消息为消息添加操作对话框菜单 设置概览整理您的设置自定义您的设置使用已保存的值在代码中构建层次结构处理其他设备类型首选组件和属性 搜索概览创建搜索界面添加近期查询建议添加自定义建议可搜索配置 添加搜索功能概览设置搜索界面存储和搜索数据其他后向兼容组件复制和粘贴拖放画中画支持 创建后向兼容界面概览抽象化新API代理到新API使用旧版API创建实现使用版本感知组件设备控制 动画和过渡概览动画简介属性动画概览为可绘制图形添加动画使用动画显示或隐藏视图使用动画移动视图使用Fling动画移动视图使用缩放动画放大视图运用弹簧物理学原理为图形运动添加动画自动为布局更新添加动画使用过渡效果为布局变化添加动画创建自定义过渡动画使用动画启动Activity使用ViewPager在Fragment之间滑动使用ViewPager2在Fragment之间滑动从ViewPager迁移到ViewPager2其他资源 图片和图形概览可绘制对象概览矢量可绘制对象概览处理位图使用PaletteAPI选择颜色减小图片下载大小硬件加速OpenGLES 使用OpenGLES显示图形概览构建OpenGLES环境定义形状绘制形状应用投影和相机视图添加动画响应触摸事件 渲染概览减少过度绘制性能和视图层次结构使用GPU渲染模式分析工具进行分析使用广色域内容增强图形效果 音频和视频音频和视频概览媒体控件支持的媒体格式媒体编解码器 媒体应用架构媒体应用架构概览使用媒体会话 开发音频应用音频应用概览构建媒体浏览器服务构建媒体浏览器客户端媒体会话回调使用媒体控制器测试应用 开发视频应用视频应用概览构建视频播放器活动媒体会话回调响应媒体按钮处理音频输出的变化管理音频焦点Google助理和媒体应用 在设备之间传输传输概览MediaRouter概览MediaRouteProvider概览使用VolumeShaper控制振幅MediaPlayer概览MediaRecorder概览ExoPlayer共享音频输入捕获播放的音频帧速率其他媒体资源 服务概览前台服务绑定服务AIDL概览 后台任务概览后台线程后台优化 广播概览隐式广播例外情况 管理设备唤醒状态概览使设备保持唤醒状态安排重复闹钟 权限概览评估您的应用是否需要权限声明应用权限请求应用权限应用权限最佳做法仅在默认处理程序中使用的权限限制与其他应用的交互定义自定义权限 应用数据和文件概览存储空间概览保存到应用专属存储空间 保存到共享的存储空间概览媒体文档和其他文件数据集管理存储设备上的所有文件保存键值对数据 将数据保存到本地数据库概览使用实体定义数据使用DAO访问数据定义对象之间的关系编写异步DAO查询创建视图并将其关联到数据库预填充数据库迁移数据库测试和调试数据库引用复杂数据从SQLite迁移到Room使用SQLite保存数据存储空间用例和最佳做法 分享简单的数据概览将简单的数据发送到其他应用从其他应用接收简单的数据 分享文件概览设置文件分享分享文件请求某个分享的文件检索文件信息 使用NFC分享文件概览将文件发送到其他设备从其他设备接收文件 打印文件概览打印照片打印HTML文档打印自定义文档 内容提供程序概览内容提供程序基础知识创建内容提供程序使用存储访问框架打开文件创建自定义文档提供程序应用安装位置 用户数据和身份概览添加登录工作流显示生物识别身份验证对话框 自动填充框架概览针对自动填充优化应用构建自动填充服务将自动填充功能与键盘集成审核数据访问获取用户可重置的广告ID日历提供程序概览 联系人提供程序概览检索联系人列表检索联系人的详细信息使用Intent修改联系人显示快速联系标志帐号转移 数据备份概览备份用户数据备份键值对测试备份和恢复唯一标识符最佳做法 记住用户并对用户进行身份验证概览记住您的用户对OAuth2服务进行身份验证创建自定义帐号类型 用户位置概览请求位置权限获取最近一次的已知位置更改位置信息设置请求位置信息更新在后台访问位置信息创建和监控地理围栏检测用户何时启动Activity优化位置信息服务,节省电量迁移到LocationAPI和ContextAPI添加地图 触摸和输入概览输入事件 使用触摸手势概览检测常用手势跟踪触摸和指针移动以动画方式显示滚动手势支持导航手势处理多点触控手势拖动并缩放在ViewGroup中管理触摸事件 处理键盘输入概览指定输入法类型处理输入法可见度支持键盘导航处理键盘操作 支持游戏控制器概览处理控制器操作支持各种Android版本的控制器支持多个游戏控制器 输入法编辑器创建输入法图片键盘拼写检查工具 CameraX概览CameraX架构配置预览分析图片图片拍摄供应商扩展转换输出用例旋转CameraX设备 Camera2概览相机捕获会话和请求相机枚举同时使用多个相机信息流多相机API 相机概览拍照录制视频控制相机CameraAPI 传感器概览传感器概览动态传感器位置传感器环境传感器原始GNSS测量值 连接性概览 执行网络操作概览连接到网络管理网络使用情况读取网络状态优化网络流量消耗解析XML数据 使用Volley传输网络数据概览发送简单请求设置RequestQueue提出标准请求实现自定义请求 使用Cronet执行网络操作概览发送简单请求Cronet请求生命周期 参考文档 org.chromium.net概览CallbackException CronetEngine概览 CronetEngine.Builder概览LibraryLoaderCronetExceptionInlineExecutionProhibitedExceptionNetworkExceptionQuicExceptionUploadDataProviderUploadDataProvidersUploadDataSink UrlRequest概览Builder回调状态StatusListener UrlResponseInfo概览HeaderBlock使用5G增强应用使用gRPC构建客户端-服务器应用 在不消耗大量电池电量的情况下传输数据概览优化下载以实现高效网络访问尽量减少定期更新的影响避免冗余下载基于连接类型修改模式 减少网络耗电量概览收集网络流量数据分析数据流量优化用户发起的网络使用优化应用发起的网络使用优化服务器发起的网络使用优化常规网络使用 使用同步适配器传输数据概览创建存根身份验证程序创建存根内容提供程序创建同步适配器运行同步适配器 蓝牙概览蓝牙低功耗概览 NFC概览NFC基础知识高级NFC基于主机的卡模拟概览 电信概览构建通话应用防止来电显示仿冒电话ID WLAN概览WLAN扫描功能概览WLAN对等连接WLAN感知概览通过RTT确定WLAN位置信息仅限本地使用的热点 WLAN基础架构WLAN基础架构概览适用于互联网连接的WLAN建议API适用于点对点连接的Wi-Fi网络请求APIPasspoint保存网络和Passpoint配置 USB概览配件概览主机概览VPN会话发起协议概览 发现并连接概览使用网络服务发现通过WLAN建立点对点连接将WLAN点对点用于服务发现WLANEasyConnectOpenMobileAPI读取器支持 Renderscript概览高级RenderScript RuntimeAPI参考文档概览数字类型对象类型转换函数数学常量和函数矢量数学函数矩阵函数四元数函数原子更新函数时间函数和类型分配数据访问函数对象特性函数内核调用函数和类型输入/输出函数调试函数图形函数和类型索引 基于网络的内容概览在WebView中构建网络应用管理WebView对象调暗网络内容WebView崩溃报告中的用户隐私迁移到Android4.4中的WebView支持网络应用中的不同屏幕调试网络应用网络应用最佳做法 AndroidAppBundle概览 Play功能分发概览配置基本模块配置安装时分发配置按需分发按需分发最佳做法配置免安装分发配置按条件分发 PlayAssetDelivery概览针对原生或Java构建针对Unity构建目标纹理压缩格式 测试您的appbundle概览在本地测试模块的安装情况 GooglePlayGooglePlay结算服务 GooglePlay核心库概览Play功能分发 PlayAssetDelivery概览整合资产分发(Java)整合资产分发(原生)整合资产分发(Unity)测试AssetDelivery 应用内评价概览使用Kotlin或Java进行集成使用原生代码进行集成使用Unity进行集成测试应用内评价支持应用内更新在本地测试模块的安装服务条款 GooglePlay免安装体验GooglePlay免安装体验概览 免安装应用开发入门创建免安装的appbundle应用的用户体验最佳做法 免安装游戏开发入门概览Unity插件游戏的用户体验最佳做法迁移至AndroidAppBundle实现资源的云端分发支持GooglePlay游戏服务免安装Play游戏免安装Play游戏核对清单缩减免安装应用或游戏的大小将广告添加到您的免安装应用或游戏中提供多个入口点 与Firebase集成为您的免安装应用添加GoogleAnalyticsforFirebase将Firebase动态链接用于免安装应用技术要求核对清单GooglePlay免安装体验政策 资源参考文档代码示例SDK版本说明免安装应用Intent 支持已知问题StackOverflowGooglePlayDeveloperAPIAPK扩展文件 应用许可概览许可概览设置许可添加服务器端验证添加客户端验证许可参考 GooglePlayInstallReferrer概览 PlayInstallReferrer库概览参考文档版本说明PlayInstallReferrerAPI 应用操作 切片概览使用入门切片模板 游戏 开发开发者预览版使用Unity制作游戏使用Unreal制作游戏打造无缝登录体验确定敏感数据访问需求保障游戏安全开发适用于所有屏幕的游戏了解如何在游戏循环中进行渲染 优化用于优化游戏的工具支持64位架构提升游戏性能在游戏中有效管理内存检测和诊断崩溃问题识别CPU热点 实现AndroidGameSDK概览版本说明 实现适当的帧同步概览 OpenGL渲染程序集成更新编译设置添加帧同步函数验证帧同步的改进效果 Vulkan渲染程序集成更新编译设置添加帧同步函数验证帧同步的改进效果 优化帧速率概览 自定义引擎集成概览运行演示版应用启用API更新构建设置定义注释、保真度参数和设置添加帧计时函数添加加载时间记录函数验证、打包和发布APK排查常见错误高级用法 Unity集成概览启用API集成插件初始化库并验证操作定义注解、保真度参数和质量级别添加加载时间记录函数运行监控应用检查并发布排查常见错误 参考文档 帧同步库概览模块Swappy常用工具适用于OpenGL的Swappy适用于OpenGL的Swappy(额外信息)适用于Vulkan的Swappy结构体SwappyStatsSwappyThreadFunctionsSwappyTracerSwappyVkFunctionProvider PerformanceTuner库 自定义引擎概览模块调整Fork缓存实用程序调整Fork附加实用程序调整Fork主接口结构体TuningFork_CProtobufSerializationTuningFork_CacheTuningFork_LoadingTimeMetadataTuningFork_MetricLimitsTuningFork_Settings Unity概览类AndroidPerformanceTunerLoadingTimeMetadataResult结构体MetricLimits命名空间GoogleGoogle.AndroidGoogle.Android.PerformanceTuner缩减游戏大小个人资料图片调试原生内存使用问题 发布和迭代在GooglePlay上发布您的游戏使用Unity创建AndroidAppBundle添加对即时访问的支持与您的用户群保持联系 最佳做法 依赖项注入概览手动依赖项注入使用Hilt实现依赖项注入在多模块应用中使用HiltHilt和Jetpack集成Hilt测试指南 DaggerDagger基础知识在Android应用中使用Dagger在多模块应用中使用Dagger 测试概览测试基础知识设置项目 构建有效的单元测试概览构建本地单元测试构建仪器单元测试 自动执行界面测试概览测试单个应用的界面测试多个应用的界面 测试应用组件集成概览测试您的服务测试您的内容提供程序测试界面性能 Espresso概览设置说明基础知识测试方案多进程无障碍功能检查清单Intent网络空闲资源备忘单其他资源UIAutomator应用抓取工具JUnit4规则AndroidJUnitRunner版本说明其他资源 性能概览 AndroidVitals概览部分唤醒锁定操作卡住唤醒次数过多后台WLAN扫描次数过多后台网络使用量过高ANR崩溃呈现速度缓慢冻结的帧权限遭拒应用启动时间应用待机分桶进程和线程概览通过线程提升性能 优化电池续航时间概览对低电耗模式和应用待机模式进行针对性优化监控电池电量和充电状态确定和监控插接状态和基座类型电源管理限制分析电池用量使用BatteryHistorian分析耗电情况测试电量相关问题缩减应用体量 管理内存内存管理概览进程间的内存分配管理应用内存 系统跟踪概览通过命令行捕获跟踪记录捕获设备上的跟踪记录浏览报告定义自定义事件检查GPU渲染专为无缝体验而设计让您的应用随时能迅速响应性能提示SMPPrimerforAndroid在AndroidRuntime(ART)上验证应用行为 无障碍概览 构建和测试应用的无障碍功能让应用使用起来更没有障碍改进应用无障碍功能要遵循的原则测试应用的无障碍功能 高级主题让自定义视图使用起来更没有障碍创建自己的无障碍服务其他资源 隐私设置隐私设置最佳做法 安全性应用安全最佳做法安全提示数据安全在其他各Android版本中确保数据安全通过HTTPS和SSL确保安全网络安全配置更新您的安全提供程序以防范SSL攻击 使用SafetyNet抵御安全威胁概览SafetyNetAttestationAPISafetyNetSafeBrowsingAPISafetyNetreCAPTCHAAPISafetyNetVerifyAppsAPI加密Android密钥库系统使用密钥认证功能来验证由硬件支持的密钥对Android受保护的确认支持直接启动运行嵌入式DEX代码应用安全性改进计划 为数十亿用户打造产品概览网络连接设备功能数据费用耗电量界面和内容 为企业打造产品概览开发者指南工作资料设置托管配置 应用反馈向EMM发送应用反馈测试应用反馈工作联系信息设备管理政策 设备管理概览构建设备政策控制器 专用设备概览锁定任务模式多用户实战宝典设备控制网络和电话安全性系统更新网络活动日志 Android版本概览Android11Android10Android9Android8.0Android7.0设备管理 Android开发者 文档 指南 创建输入法 输入法(IME)是一种可让用户输入文本的用户控件。

Android提供了一种可扩展的输入法框架。

借助该框架,应用可以为用户提供备选输入法,例如屏幕键盘,甚至语音输入。

安装所需的IME后,用户可以从系统设置中选择要使用的IME,并在整个系统中使用该IME;同时只能启用一个IME。

如要向Android系统添加IME,您需要创建一个Android应用,其中包含一个扩展InputMethodService的类。

此外,您通常需要创建一个“设置”Activity,以向IME服务传递选项。

您还可以定义一个设置界面,使其作为系统设置的一部分显示。

本指南涵盖以下内容: IME生命周期 在应用清单中声明IME组件 IMEAPI 设计IME界面 将文本从IME发送到应用 使用IME子类型 如果您以前没有处理过IME,则应先阅读入门文章屏幕输入法。

注意:从Android 11开始,平台允许IME以内嵌方式(而不是使用下拉菜单)显示自动填充建议。

如需详细了解自动填充服务如何支持此功能,请参阅将自动填充功能与键盘集成。

IME生命周期 下图显示了IME的生命周期: 图1.IME的生命周期。

以下各部分介绍了如何实现与遵循此生命周期的IME相关联的界面和代码。

在清单中声明IME组件 在Android系统中,IME是包含一项特殊IME服务的Android应用。

应用的清单文件必须声明该服务,请求必需的权限,提供一个与操作action.view.InputMethod匹配的Intent过滤器,并提供定义IME特征的元数据。

此外,要提供可让用户修改IME行为的设置界面,您可以定义一个可通过系统设置启动的“设置”Activity。

以下代码段声明了一项IME服务。

它请求了BIND_INPUT_METHOD权限以让该服务可以将IME连接到系统,设置了一个与android.view.InputMethod操作匹配的Intent过滤器,并定义了IME的元数据:
下面的代码段声明了IME的设置Activity。

它有一个适用于ACTION_MAIN的Intent过滤器,指示该Activity是IME应用的主入口点:
您还可以让用户能够直接从IME界面访问IME设置。

输入法API android.inputmethodservice和android.view.inputmethod软件包中提供了IME专用的类。

KeyEvent类对于处理键盘字符非常重要。

IME的核心部分是一个服务组件,即一个扩展InputMethodService的类。

除了实现正常的服务生命周期之外,该类还提供具有以下用途的回调:提供IME的界面,处理用户输入,以及向当前处于焦点的字段提供文本。

默认情况下,InputMethodService类提供有关管理IME状态和可见性以及与当前输入字段进行通信的大部分实现。

以下类也很重要: BaseInputConnection 定义从InputMethod返回到接收其输入的应用的通信渠道。

您可以使用该类读取光标周围的文本,将文本提交至文本框,然后将原始按键事件发送到应用。

应用应扩展该类,而不是实现基接口InputConnection。

KeyboardView 用于呈现键盘和响应用户输入事件的View的扩展。

键盘布局由Keyboard的实例指定,您可以在XML文件中定义该实例。

设计输入法界面 IME有两个主要视觉元素:输入视图和候选视图。

您只需要实现与您要设计的输入法相关的元素。

输入视图 输入视图是指用户以点击按键、手写或手势的形式输入文本的界面。

当IME首次显示时,系统会调用onCreateInputView()回调。

在此方法的实现中,您可以创建要在IME窗口中显示的布局,并将布局返回系统。

以下代码段是一个实现onCreateInputView()方法的示例: Kotlin overridefunonCreateInputView():View{ returnlayoutInflater.inflate(R.layout.input,null).apply{ if(thisisMyKeyboardView){ setOnKeyboardActionListener(this@MyInputMethod) keyboard=latinKeyboard } } } Java @Override publicViewonCreateInputView(){ MyKeyboardViewinputView= (MyKeyboardView)getLayoutInflater().inflate(R.layout.input,null); inputView.setOnKeyboardActionListener(this); inputView.setKeyboard(latinKeyboard); returninputView; } 在此示例中,MyKeyboardView是KeyboardView(呈现Keyboard)的自定义实现的一个实例。

候选视图 候选视图是指IME显示可能的字词更正或文字建议供用户选择的界面。

在IME生命周期中,系统会在准备好显示候选视图时调用onCreateCandidatesView()。

在此方法的实现中,可以返回显示文字建议的布局;如果您不想显示任何内容,可以返回null。

Null响应是默认行为,因此如果您不提供建议,则无需实现此方法。

界面设计注意事项 此部分介绍了一些具体的IME界面设计注意事项。

处理多种屏幕尺寸 IME的界面必须能够针对不同的屏幕尺寸进行缩放,并且还必须处理横向和纵向屏幕方向。

在非全屏IME模式下,留出足够的空间供应用显示文本字段和任何关联的上下文,以使IME占用不超过一半的屏幕空间。

在全屏IME模式下,不存在此问题。

处理不同的输入类型 通过Android文本字段,您可以设置特定的输入类型,例如自由格式的文本、数字、网址、电子邮件地址以及搜索字符串。

当实现新的IME时,您需要检测每个字段的输入类型,并为其提供相应的界面。

不过,您无需设置IME来检查用户针对输入类型输入的文本是否有效;这项工作由拥有相应文本字段的应用负责。

例如,以下是随Android平台提供的拉丁语IME针对文本和电话号码输入提供的界面的屏幕截图: 图2.拉丁语IME输入类型。

当输入字段获得焦点并且您的IME启动时,系统会调用onStartInputView(),并传入一个EditorInfo对象,其中包含有关输入类型和文本字段的其他属性的详情。

在该对象中,inputType字段包含文本字段的输入类型。

inputType字段是一个包含各种输入类型设置的位模式的int。

如要针对文本字段的输入类型测试该字段,请使用常量TYPE_MASK_CLASS遮盖它,如下所示: Kotlin inputTypeandInputType.TYPE_MASK_CLASS Java inputType&InputType.TYPE_MASK_CLASS 输入类型位模式可以具有以下值之一: TYPE_CLASS_NUMBER 用于输入数字的文本字段。

如前面的屏幕截图所示,拉丁语IME显示了适用于此类型的字段的数字键盘。

TYPE_CLASS_DATETIME 用于输入日期和时间的文本字段。

TYPE_CLASS_PHONE 用于输入电话号码的文本字段。

TYPE_CLASS_TEXT 用于输入所有受支持字符的文本字段。

InputType的参考文档中对这些常量进行了更详细的介绍。

inputType字段可以包含其他位,以指示文本字段类型的变体,例如: TYPE_TEXT_VARIATION_PASSWORD 用于输入密码的TYPE_CLASS_TEXT的变体。

输入法将显示装饰标志,而不是实际文本。

TYPE_TEXT_VARIATION_URI 用于输入网址以及其他统一资源标识符(URI)的TYPE_CLASS_TEXT的变体。

TYPE_TEXT_FLAG_AUTO_COMPLETE TYPE_CLASS_TEXT的变体,用于输入应用从字典、搜索或其他工具“自动填充”的文本。

在测试这些变体时,请务必使用相应的常量遮盖inputType。

InputType的参考文档中列出了可用的遮盖常量。

注意:在您自己的IME中,请确保在将文本发送到密码字段时对其进行正确处理。

在界面中的输入视图和候选视图中隐藏密码。

另请注意,您不应将密码存储在设备上。

如需了解详情,请参阅安全设计指南。

向应用发送文本 当用户使用您的IME输入文本时,您可以通过以下方式向应用发送文本:发送单个按键事件,或在应用的文本字段中修改光标周围的文本。

在任何一种情况中,您都要使用InputConnection的实例来提供文本。

如要获取该实例,请调用InputMethodService.getCurrentInputConnection()。

修改光标周围的文本 在处理对文本字段中现有文本的修改时,您可以使用BaseInputConnection中提供的一些更实用的方法,包括: getTextBeforeCursor() 返回CharSequence,其中包含当前光标位置之前请求数量的字符 getTextAfterCursor() 返回CharSequence,其中包含当前光标位置之后请求数量的字符。

deleteSurroundingText() 删除当前光标位置前后指定数量的字符。

commitText() 将CharSequence提交至文本字段并设置一个新的光标位置。

例如,以下代码段展示了如何将光标左侧的四个字符替换为文本“Hello!”: Kotlin currentInputConnection.also{ic:InputConnection-> ic.deleteSurroundingText(4,0) ic.commitText("Hello",1) ic.commitText("!",1) } Java InputConnectionic=getCurrentInputConnection(); ic.deleteSurroundingText(4,0); ic.commitText("Hello",1); ic.commitText("!",1); 在提交之前书写文本 如果您的IME执行文本预测或需要多个步骤来书写某个字形或字词,则您可以在文本字段中显示进度(直到用户提交相应字词),然后将部分文本替换为已完成的文本。

在将文本传递至setComposingText()时,您可以通过向文本添加“span”对其进行特殊处理。

以下代码段展示了如何在文本字段中显示进度: Kotlin currentInputConnection.also{ic:InputConnection-> ic.setComposingText("Composi",1) ic.setComposingText("Composin",1) ic.commitText("Composing",1) } Java InputConnectionic=getCurrentInputConnection(); ic.setComposingText("Composi",1); ic.setComposingText("Composin",1); ic.commitText("Composing",1); 以下屏幕截图展示了这一过程向用户显示的情况: 图3.在提交之前书写文本。

拦截硬件按键事件 即使输入法窗口未获得明确的焦点,它也会先接收硬件按键事件,并且可以选择是使用这些事件,还是将其转发到应用。

例如,您可能需要使用方向键在界面中导航,以便在书写文本期间选择候选项。

您可能还需要点按返回键,以便关闭来自输入法窗口的任何弹出式窗口。

如要拦截硬件按键,请替换onKeyDown()和onKeyUp()。

请务必对您不想自行处理的按键调用super()方法。

创建IME子类型 借助子类型,IME可以提供多种受支持的输入模式和语言。

子类型可以代表以下内容: 语言区域,例如en_US或fr_FR。

输入模式,例如语音输入、键盘输入或手写输入。

特定于IME的其他输入样式、形式或属性,例如10键键盘布局或QWERTY键盘布局。

模式基本上可以是任何文本,例如“keyboard”、“voice”等。

子类型还可以提供这些模式的组合。

子类型信息用于通知栏中提供的IME切换器对话框以及IME设置。

通过此信息,框架还可以直接调出IME的特定子类型。

在构建IME时,请使用子类型工具,因为它可以帮助用户识别不同的IME语言和模式并在它们之间切换。

您可以使用元素在输入法的某个XML资源文件中定义子类型。

以下代码段定义了一个具有两个子类型的IME:用于美国英语语言区域的键盘子类型,以及用于法国法语语言区域的另一种键盘子类型: 为了确保您的子类型在界面中的标签准确无误,请使用%s获取与子类型的语言区域标签相同的子类型标签。

以下两个代码段演示了此过程。

第一个代码段显示了输入法的XML文件的一部分: 第二个代码段是IME的strings.xml文件的一部分。

字符串资源label_subtype_generic(由输入法界面定义用来设置子类型的标签)定义为: %s 此设置可使子类型的显示名与语言区域设置一致。

例如,在任何英语语言区域中,显示名都是“English(UnitedStates)”。

从通知栏中选择IME子类型 Android系统会管理所有IME提供的所有子类型。

IME子类型被视为它们所属IME的模式。

在通知栏中,用户可以为当前设置的IME选择一个可用的子类型,如以下屏幕截图所示: 图4.从通知栏中选择IME子类型。

图5.在系统设置中设置子类型偏好设置。

从系统设置中选择IME子类型 用户可以在“系统设置”区域的“语言和输入法”设置面板中控制子类型的使用方式。

图6.为IME选择语言。

在IME子类型之间切换 通过在键盘上提供切换键(例如地球形状的语言图标),可以让用户在多个IME子类型之间轻松切换。

这样做可以极大地提高键盘的易用性,并且有助于避免用户产生不满。

如要启用此类切换,请执行以下步骤: 在输入法的XML资源文件中声明supportsSwitchingToNextInputMethod="true"。

您的声明应类似于以下代码段: 调用shouldOfferSwitchingToNextInputMethod()方法。

如果该方法返回true,则显示一个切换键。

当用户点按该切换键时,调用switchToNextInputMethod(),向第二个参数传递false。

False值会告知系统以同样的方式处理所有子类型,无论它们属于哪种IME。

指定true则会要求系统循环切换当前IME中的子类型。

注意:在Android5.0(API级别21)之前的版本中,switchToNextInputMethod()无法感知supportsSwitchingToNextInputMethod属性。

如果用户在没有切换键的情况下切换到某个IME,可能会卡在该IME中,无法轻松从中切换出来。

IME一般注意事项 在实现IME时,还需要考虑以下事项: 为用户提供一种直接通过IME界面设置选项的方式。

由于设备上可能安装了多个IME,因此请为用户提供一种可以直接从输入法界面切换到其他IME的方式。

快速调出IME界面。

预加载或按需加载任何大型资源,以便用户可以在点按文本字段后立即看到IME。

缓存用于输入法后续调用的资源和视图。

相反,您应在输入法窗口隐藏之后立即释放较大的内存分配,以便应用可以有足够的内存来运行。

考虑在IME处于隐藏状态几秒钟后使用延迟消息来释放资源。

确保对于与IME相关联的语言或语言区域,用户可以输入尽可能多的字符。

请注意,用户可能会在密码或用户名中使用标点符号,因此您的IME必须提供多种不同的字符,以允许用户输入密码并访问设备。

ContentandcodesamplesonthispagearesubjecttothelicensesdescribedintheContentLicense.JavaisaregisteredtrademarkofOracleand/oritsaffiliates. Lastupdated2021-05-03UTC. [] [] 微信 在微信上关注“GoogleDevelopers” Twitter 在Twitter上关注@AndroidDev YouTube 在YouTube上访问“AndroidDevelopers”频道 关于Android Android Enterprise 安全 源代码 支持 报告平台错误 报告文档错误 GooglePlaysupport 参加调查研究 文档 开发者指南 设计指南 API参考 示例 AndroidStudio Android Chrome Firebase GoogleCloudPlatform 所有产品 隐私权政策 许可 品牌指南 ICP证合字B2-20070004号 通过电子邮件接收资讯和提示 订阅 Language English BahasaIndonesia Deutsch Español Español–AméricaLatina Français Português–Brasil TiếngViệt Türkçe Русский ภาษาไทย 中文–简体 中文–繁體 日本語 한국어



請為這篇文章評分?