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

 我来答
小傻

推荐于2016-05-05 · 知道合伙人软件行家
小傻
知道合伙人软件行家
采纳数:11567 获赞数:31136
已经做过两个上架的app和两个网页项目.

向TA提问 私信TA
展开全部
软件盘的本质是什么?软键盘其实是一个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_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" /> <LinearLayout android:id="@+id/bottom_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:gravity="bottom">s <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" 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被顶到了输入法的上方。
郎丽念自怡
2019-01-17 · TA获得超过3795个赞
知道大有可为答主
回答量:3184
采纳率:26%
帮助的人:272万
展开全部
不知道你是说的哪一种?(1):虚拟键盘弹出后一般会占据当前activity的大部分,所以肉眼可以看到;(2):代码中判断://判断隐藏软键盘是否弹出
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
徐小小天
推荐于2016-06-21 · TA获得超过1453个赞
知道小有建树答主
回答量:839
采纳率:83%
帮助的人:769万
展开全部
(1):虚拟键盘弹出后一般会占据当前activity的大部分,所以肉眼可以看到;
(2):代码中判断:
//判断隐藏软键盘是否弹出
if(getWindow().getAttributes().softInputMode==WindowManager.LayoutParamsSOFT_INPUT_STATE_UNSPECIFIED)
{
//隐藏软键盘
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
o几星霜o
2015-10-10 · TA获得超过307个赞
知道小有建树答主
回答量:178
采纳率:0%
帮助的人:166万
展开全部

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

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

  1.   WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED(显示)

  2.   WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN(隐藏)

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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sfuzxh
2015-09-29 · 贡献了超过101个回答
知道答主
回答量:101
采纳率:0%
帮助的人:20.9万
展开全部
这个有点复杂,,楼下来吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式