如何获取android的软键盘怎么切换输入法的显示状态

我原来的问题是对于腾讯微博嘚OAuth验证webView,弹出软键盘怎么切换输入法后输入框上移就看不到输入框了,后发现Webview放到了ScrollView中将ScrollView改为LinearLayout问题解决了,不会在弹出软键盘怎么切換输入法后大幅滚动不过下面还是详细介绍下软键盘怎么切换输入法和activity页面遮挡的问题。

通常情况下如果我们在一个输入框输入内容輸入法键盘弹出时,activity自动设置高度相当于在activity向上滚动了添加了输入法键盘的高度。但有时可能淹没当前的输入框如果希望输入法键盘彈出时不自动向上挤压activity,在activty中设置属性android:windowSoftInputMode="adjustPan"这样输入法可以覆盖Activity显示,如下:

属性stateVisible表示默认显示输入法键盘其他属性见:

adjustPan同样存在问题,即可能需要关闭软键盘怎么切换输入法定位被挡住的输入框,我希望的是介于adjustPan和adjustResize之间的解决方案即软键盘怎么切换输入法会对activity有一定擠压,但是焦点所在输入框始终会显示在屏幕上有会的朋友欢迎留言分享,个人觉得可能的解决方案是重写其中的

方法,使得h参数动態变化达到效果但较耗时,暂不想尝试了

activity主窗口与软键盘怎么切换输入法的交互模式,可以用来避免输入法面板遮挡问题Android1.5后的一个噺特性。

这个属性能影响两件事情:

【一】当有焦点产生时软键盘怎么切换输入法是隐藏还是显示

【二】是否减少活动主窗口大小以便騰出空间放软键盘怎么切换输入法

【A】stateUnspecified:软键盘怎么切换输入法的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置

【B】stateUnchanged:当这个activity出现时软键盘怎么切换输入法将一直保持在上一个activity里的状态,无论是隐藏还是显示

【G】adjustUnspecified:默认设置通常由系统自行决定是隐藏还是显示

【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘怎么切换输入法的空间

【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盤覆盖和用户能总是看到输入内容的部分

}

如果有需要用到输入的哋方通常会有需要自动弹出或者收起软键盘怎么切换输入法的需求。开篇明义本文会讲讲弹出和收起软键盘怎么切换输入法的一些细節,最终还会从源码进行分析

特别说明:本文的所有分析的源码,都是基于 Android 26 的源码

前面提到,想要操作軟键盘怎么切换输入法需要使用 InputMethodManager ,它是一个系统服务想要获取它,可以使用 getSystemService() 获取到它。

毕竟是系统服务使用的时候为了安全,还昰要判空避免空指针。

它有两个重载方法而通常我们会使用它的两个参数的方法。

这里我们只需要传递两個参数它首先需要一个 View ,使用软键盘怎么切换输入法就是为了输入而输入就需要有接收输入内容的 View ,这里接收输入的 View 最好是一个 EditText(泹这不是必须的)。

而第二个参数 flags 就是个标志位从上面截图的方法签名上的文档上可以看到,它接收 0 或者 SHOW_INPYT_IMPLICIT 两个参数但是实际上,它有苐三个参数另外一个是 SHOW_FORCED。

可以看到 1、2 都是有特殊含义的实际上它们并不影响显示,只是在隐藏的时候会有一些限制,这些后面看源碼的时候再说一般没有特别需要的话,我们直接传递 0 就好了

现在,简单总结一下调用 showSoftInput() 会生效的关键点:

1、第一个参数最好是 EditText 或者它嘚子类。

2、第一个参数必须是可获取焦点的,并且当前已经获取到焦点

EditText 默认是允许获取焦点的,但是假如布局中存在多个可获取焦點的控件,就需要提前让我们传递进去的 View 获取到焦点获取焦点可以使用 requestFocus() 方法。

3、布局必须加载完成

所以最终,完整的显示软键盘怎么切换输入法的代码就如下所示了

先来看看这个方法的签名,它同样有两个方法可以调用

它接收两个参数,苐一个参数是一个 IBinder 可以直接传递一个 View.getWindowToken() 的 windowToken 对象就可以了。而第二个参数就是隐藏软键盘怎么切换输入法的标志位,如果没有特殊要求的話直接传递 0 就好了。

注意这里虽然原则上需要传递一个之前弹出键盘传递的时候传递的 View 的 windowToken ,但是实际情况是你只需要传递一个存在于當前布局 ViewTree 中随意一个 View 的 windowToken 就可以了。

最终隐藏软件的代码就是这样的

2.4 切换键盘的弹出和隐藏

虽然这个方法,限制佷少但是我们基本上不会使用它。主要原因在于它是一个开关的方法,会根据当前的状态做相反的操作这就导致很多时候,我们在玳码中无法直接根据 InputMethodManager 提供的方法判断当前软键盘怎么切换输入法的显示状态,这样也就无法确定调用它的时候的效果了

前面的一些方法,都需要传递一个 flag 值文档中描述的并不详细,我们就从源码的角度来分析一下这些 flag 的含义。

这个方法的代码很長我们只关心和 flag 相关的代码。

DEBUG == true 会输出的 Log 中已经可以看到含义了。这里会根据显示和隐藏传递的两个 flag 来进行比对也就是说,如果 flag 使鼡不正确可能导致这里直接返回 false ,从而无法隐藏软键盘怎么切换输入法这些细节对照代码就清晰了,就不在文章里屡这些细节了

所鉯这就是为什么前面提到,如果没有特殊要求直接传递 0 就好了,可以规避这个限制

3.2 如何判断軟键盘怎么切换输入法是否弹出

既然 toggleSoftInput() 可以根据当前软键盘怎么切换输入法的状态,进行不同的操作那么肯定是有办法确定当前软键盘怎麼切换输入法的状态的。

在这个方法中是根据 isInputViewShow() 方法来判定当前软键盘怎么切换输入法是否处于显示弹出的状态。但是我们并没有办法矗接和 InputMethodService 进行交互,我们也就没办法直接拿到当前键盘是否显示

如果想要监听键盘的弹出和收起,可以使用 ViewTreeObserver.OnGlobalLayoutListener 这个监听来监听布局的调整,从而判断出键盘的弹出和隐藏这些细节有时间再聊。

既然已经清楚了软键盘怎么切换输入法的收起和弹出的方法细节那我们来寫一个帮助类,来解决这个问题让你们拿到就可用。

今天在承香墨影公众号的后台回复『成长』。我会送你一些我整理的学习资料包含:Android反编译、算法、设计模式、虚拟机、Linux、Kotlin、Python、爬虫、Web项目源码。

}

我们一直在讲C++写游戏代码,然後通过NDK编译然后展现在Android层。

在游戏中的各种输入框点击就会出现Android的软键盘怎么切换输入法。这其实是C++调用了Android层然后在Android层获得软键盘怎么切换输入法的输入内容,然后把内容返回到C++层

我们这里讲的是Android层调出软键盘怎么切换输入法然后获取到用户输入显示在TextView上面,至于怎么将Android层获取到的内容返回到C++层请看

好了,下面是Android调用输入法软键盘怎么切换输入法获取用户输入的例子

我们工程里面有两个Activity,一个昰主界面另外一个界面上有一个输入框加上一个完成按钮,点击完成按钮就把获取到的软键盘怎么切换输入法输入传递到主界面Activity

1. 点击游戲中的输入框触发事件

3. InputActivity中的输入框显示出了输入的内容,点击完成按钮Android调用C++ 传递输入内容到上一个Activity(即游戏中)

4. 在C++层设置输入框显示。

}

我要回帖

更多关于 软键盘怎么切换输入法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信