Android输入法之——如何在代码中强制切换输入法

本文介绍了Android平台中两种实现输入法切换的方法。一种是通过InputMethodManager.setInputMethod()进行强制切换,但需要特定权限;另一种是使用InputMethodService.switchInputMethod(),更为简便。文章详细解析了第二种方法的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

转载自:http://xiaohang.org/2011/02/android%E8%BE%93%E5%85%A5%E6%B3%95%E4%B9%8B%E2%80%94%E2%80%94%E5%A6%82%E4%BD%95%E5%9C%A8%E4%BB%A3%E7%A0%81%E4%B8%AD%E5%BC%BA%E5%88%B6%E5%88%87%E6%8D%A2%E8%BE%93%E5%85%A5%E6%B3%95/

 

由于工作需要,追踪Android输入法Framework中了关于输入法切换的实现过程或者说是API调用的部分。
找到如下两个API:

1.InputMethodManager.setInputMethod (IBinder token, String id)
public void setInputMethod (IBinder token, String id)
Force switch to a new input method component. This can only be called from the currently active input method, as validated by the given token.
Parameters
token Supplies the identifying token given to an input method when it was started, which allows it to perform this operation on itself.
id The unique identifier for the new input method to be switched to.
此函数,当然是可以实现输入法的强制切换的,但是,IBinder的获得却需要一定的权限,调用起来需要比较深入,哥们能力有限专研的一阵子未果。日后,再做深入探讨吧。哪位仁兄有解,欢迎留言,不胜感激!!

2.InputMethodService.switchInputMethod(String id)
public void switchInputMethod (String id)
Since: API Level 3 Force switch to a new input method, as identified by id. This input method will be destroyed, and the requested one started on the current input field.
Parameters
id Unique identifier of the new input method ot start.
相对第一个API来说,这个却简单的多。最直观来看的话,就是这里不用获得相应的IBinder!我们几乎已经胜利了,但是,还是需要点破这层纸的。
首先,关于该API在何处调用?
该API属于类InputMethodService,而每个输入应用的入口类又都是继承于该类的,所以,在输入法入口类调用该API就可以了。比如,Google的SDK中给出的Google拼音输入法,就在类PinyinIME.java中调用就可以了!
再者,关于参数id?
从定义来看,它是一个String类型,看Google的解释也未免笼统。经小可仔细专研,原来,是这样的,还是用例子来说吧,依然选择上述例子。 Google拼音输入法的id就是:com.android.inputmethod.pinyin/.PinyinIME。完整的调用方法就 是:switchInputMethod(“com.android.inputmethod.pinyin/.PinyinIME”);
那么,如果不在入口类中如何调用呢?
在需要调用的类中定义:private PinyinIME mImeService;
需要的地方调用就可以了:mImeService.switchInputMethod(“com.android.inputmethod.pinyin/.PinyinIME”);
OK!打完收工!

 

### 游戏中输入法自动弹出解决方案 对于游戏中输入法自动弹出的问题,可以采取多种措施来防止这一现象的发生。 #### 启用输入法屏蔽功能 部分游戏内置有输入法屏蔽选项。当此功能被启用后,在游戏运行期间任何情况下都不会触发输入法的加载或切换,有效阻止不必要的输入法弹出行为[^1]。 #### 修改Activity属性配置 针对基于Android平台的游戏应用而言,可以通过修改`activity`标签下的特定属性实现对软键盘显示方式的有效控制。具体做法是在项目的`AndroidManifest.xml`文件内找到对应活动组件,并为其添加如下所示代码片段: ```xml <activity android:name=".YourGameActivity" ... android:windowSoftInputMode="stateHidden|adjustPan"> </activity> ``` 此处定义了两个参数:一是`stateHidden`表示初始状态下隐藏虚拟键盘;二是`adjustPan`用于指定界面调整模式为平移而非重新排列控件位置[^4]。 #### 调整视图焦点管理策略 有时即使设置了全局性的限制条件仍可能出现意外情况导致输入法显现出来。此时可考虑进一步精细化操作——即动态地获取当前窗口中最顶层视图对象并强制取消其获得焦点的能力,以此达到抑制输入法响应的目的。下面给出了一段示范性质Java语言源码供参考: ```java // 获取系统服务中的输入法管理者实例 InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); // 隐藏已打开的软件盘 inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); // 或者更激进的方式完全禁掉所有子view请求focus的权利 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); View rootView = ((ViewGroup)findViewById(android.R.id.content)).getChildAt(0); rootView.setFocusable(true); rootView.setFocusableInTouchMode(true); rootView.requestFocus(); ``` 通过上述三种途径之一或者组合运用即可较好地应对大多数场景下因不当因素引发的输入法无故浮现状况。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值