欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android P控制虚拟键盘的显示和隐藏

程序员文章站 2024-01-01 13:05:22
...

很久没有写过博客了,之前的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);
}

基本关键代码和位置就这些,至于怎么调用在哪调用,每个人实现不一样,实现调用的方式也会不一样

上一篇:

下一篇: