如何在Android中判断软键盘是不是弹出或隐藏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Android中判断软键盘是不是弹出或隐藏相关的知识,希望对你有一定的参考价值。

软件盘的本质是什么?软键盘其实是一个Dialog!
InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示。当我们点击输入框时,系统对活动主窗口进行调整,从而为输入法腾出相应的空间,然后将该Dialog显示在底部,或者全屏显示。
二、活动主窗口调整
android定义了一个属性,名字为windowSoftInputMode, 用它可以让程序可以控制活动主窗口调整的方式。我们可以在AndroidManifet.xml中对Activity进行设置。如:android:windowSoftInputMode="stateUnchanged|adjustPan"
该属性可选的值有两部分,一部分为软键盘的状态控制,另一部分是活动主窗口的调整。前一部分本文不做讨论,请读者自行查阅android文档。
模式一,压缩模式
windowSoftInputMode的值如果设置为adjustResize,那么该Activity主窗口总是被调整大小以便留出软键盘的空间。
我们通过一段代码来测试一下,当我们设置了该属性后,弹出输入法时,系统做了什么。
重写Layout布局:
public class ResizeLayout extends LinearLayout private static int count = 0; public ResizeLayout(Context context, AttributeSet attrs) super(context, attrs); @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) super.onSizeChanged(w, h, oldw, oldh); Log.e("onSizeChanged " + count++, "=>onResize called! w="+w + ",h="+h+",oldw="+oldw+",oldh="+oldh); @Override protected void onLayout(boolean changed, int l, int t, int r, int b) super.onLayout(changed, l, t, r, b); Log.e("onLayout " + count++, "=>OnLayout called! l=" + l + ", t=" + t + ",r=" + r + ",b="+b); @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) super.onMeasure(widthMeasureSpec, heightMeasureSpec); Log.e("onMeasure " + count++, "=>onMeasure called! widthMeasureSpec=" + widthMeasureSpec + ", heightMeasureSpec=" + heightMeasureSpec);

我们的布局设置为:
<com.winuxxan.inputMethodTest.ResizeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root_layout" android:layout_ android:layout_ android:orientation="vertical" > <EditText android:layout_ android:layout_ /> <LinearLayout android:id="@+id/bottom_layout" android:layout_ android:layout_ android:orientation="vertical" android:gravity="bottom">s <TextView android:layout_ android:layout_ android:text="@string/hello" android:background="#77777777" /> </LinearLayout> </com.winuxxan.inputMethodTest.ResizeLayout>

AndroidManifest.xml的Activity设置属性:android:windowSoftInputMode = "adjustResize"
运行程序,点击文本框,查看调试信息:
E/onMeasure 6(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742024
E/onMeasure 7(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742025
E/onSizeChanged 8(7960): =>onSizeChanged called! w=320,h=201,oldw=320,oldh=377
E/onLayout 9(7960): =>OnLayout called! l=0, t=0,r=320,b=201
从调试结果我们可以看出,当我们点击文本框后,根布局调用了onMeasure,onSizeChanged和onLayout。
实际上,当设置为adjustResize后,软键盘弹出时,要对主窗口布局重新进行measure和layout,而在layout时,发现窗口的大小发生的变化,因此调用了onSizeChanged。
从下图的运行结果我们也可以看出,原本在下方的TextView被顶到了输入法的上方。
参考技术A 不知道你是说的哪一种?(1):虚拟键盘弹出后一般会占据当前activity的大部分,所以肉眼可以看到;(2):代码中判断://判断隐藏软键盘是否弹出 参考技术B (1):虚拟键盘弹出后一般会占据当前activity的大部分,所以肉眼可以看到;
(2):代码中判断:
//判断隐藏软键盘是否弹出
if(getWindow().getAttributes().softInputMode==WindowManager.LayoutParamsSOFT_INPUT_STATE_UNSPECIFIED)

//隐藏软键盘
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
参考技术C

getWindow().getAttributes().softInputMode这个方法可以获得当前软键盘的状态。

你在需要的地方做一个判断,值是:

      WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED(显示)

      WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN(隐藏)

调用getWindow().setSoftInputMode(...)这个方法传上面两个状态值可以设置软键盘的状态。

参考技术D 这个有点复杂,,楼下来吧

android 软键盘弹起怎么让view上移

参考技术A 可以在清单文件AndroidManifest.xml中设定activty的windowInputMode属性为adjustPan即可 android:windowSoftInputMode属性影响活动的主窗口如何与包含屏幕上的软键盘窗口交互。这个属性的设置将会影响两件事情 : 1> 软键盘的状态——是否它是隐藏。

以上是关于如何在Android中判断软键盘是不是弹出或隐藏的主要内容,如果未能解决你的问题,请参考以下文章

关于项目中很多键盘无故弹出或无隐藏的总结

android中如何点击一个按钮时隐藏软键盘,(不是点击空白处隐藏软键盘)

android软键盘弹出时如何处理页面布局

qt for android 怎样弹出键盘

Android - 隐藏EditText弹出的软键盘输入(SoftInput)

Android之弹出/隐藏系统软键盘