Android P控制虚拟键盘的显示和隐藏
很久没有写过博客了,之前的zigbee就不继续了。距离遥远了,手上也没资源了。
从这个之后就是开始记录一下9年来的Android的开发遇到的问题和修改。
需求:
客户需求如下,使用谷歌拼音输入法,开关控制是否可以调出虚拟键盘,并且可以通过硬件开关强制调出虚拟键盘
细分需求:
1.给客户一个开关,可以控制虚拟键盘是否显示,如果系统带物理键盘,那实现这个很简单,就是控制Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD即可,但是是否可行我们继续分析
2.客户要求可以通过硬件开关(暂且认为是物理按钮吧)强制调出虚拟键盘,这里就存在冲突了,如果控制Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD,那么当Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD为false的时候我们是无法调出键盘的
3.客户要求使用谷歌拼音输入法,但是发现在Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD关闭的时候谷歌拼音输入法还会残留一个小键盘
以上三点,说明Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD其实走不通,那只能另想他法了。
既然控制虚拟键盘,那么只能找系统是怎么调出虚拟键盘的流程的。因为弄清楚流程,我们就可以实现1,3两步,即完全控制虚拟键盘的显示和隐藏
从点击输入框到调出输入法,有人已经写得很清楚了。我就不写了,想去看的可以自己搜索,或者看看https://blog.csdn.net/marshal_zsx/article/details/88779337
那么我们就在调出输入法的位置去做陈咬金,拦住他。
先看frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java
里面有一个public boolean showSoftInput(View view, int flags)接口,对就是这里,这里开始show出虚拟键盘来
原来是这样子的
public boolean showSoftInput(View view, int flags) {
return showSoftInput(view, flags, null);
}
现在我们根据我们的要求修改一下
public boolean showSoftInput(View view, int flags) {
if(是否要显示虚拟键盘){
return showSoftInput(view, flags, null);
}else {
return false;
}
}
这个时候就可以发现,通过开关已经可以完全控制虚拟键盘的显示和隐藏了
那么接下来我们就来解决第2个问题,强制调出。这种实现的方法就有很多了,看怎么实现。我的实现办法是通过
frameworks/base/core/java/android/inputmethodservice/InputMethodService.java的修改实现,为什么选择他呢,因为他有三个接口
public boolean isInputViewShown() {//获取当前是否显示了虚拟键盘
return mIsInputViewShown && mWindowVisible;
}
public final void requestShowSelf(int flags) {//请求调出虚拟键盘,前提是不是只运行在物理键盘模式
mImm.showSoftInputFromInputMethodInternal(mToken, flags);
}
public void requestHideSelf(int flags) {//请求关闭虚拟键盘,前提是不是只运行在物理键盘模式
mImm.hideSoftInputFromInputMethodInternal(mToken, flags);
}
因为通过这两个接口我们就可以控制虚拟键盘的显示和隐藏
最终实现就是
if(!isInputViewShown()){
requestShowSelf(InputMethodManager.SHOW_IMPLICIT);
}else{
requestHideSelf(InputMethodManager.HIDE_NOT_ALWAYS);
}
基本关键代码和位置就这些,至于怎么调用在哪调用,每个人实现不一样,实现调用的方式也会不一样