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);
}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值