一、适用范围
在android开发的过程中,我们可能会需要在android软键盘弹出或关闭的时候,执行一些动作。
(注:本文只适用于监听软键盘的弹出或关闭,而不是监听软键盘的具体某个按键,如http://blog.csdn.net/zhufuing/article/details/18964725)
二、具体实现
要监听软键盘弹出或关闭,目前没有很好的办法,只能通过布局的高度来判断键盘状态。
系统提供的InputMethodManager.isActive()方法,只能由于判断软键盘是否打开,而不能实现对软键盘的监听。
步骤:
1、android定义了一个名为windowSoftInputMode的属性, 用于控制活动主窗口调整的方式。在AndroidManifet.xml配置文件中对需要对软键盘弹出或关闭进行监听的Activity添加属性android:windowSoftInputMode="stateHidden|adjustResize"。
2、定义一个布局,继承RelativeLayout(也可以是LinearLayout或ScrollView)package com.zxg.myscroll;
/** * 定义布局类,继承RelativeLayout类 */ public class ResizeLayout extends RelativeLayout { private OnResizeListener mListener; public interface OnResizeListener { void OnResize(int w, int h, int oldw, int oldh); } /** * 定义一个监听器,用于监听布局大小的改变 */ public void setOnResizeListener(OnResizeListener listener) { mListener = listener; } public ResizeLayout(Context context, AttributeSet attrs) { super(context, attrs); } /** * * @param width 当前宽度 * @param height 当前高度 * @param oldWidth 原始宽度 * @param oldHeight 原始高度 */ @Override protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { super.onSizeChanged(width, height, oldWidth, oldHeight); if (mListener != null) { mListener.OnResize(width, height, oldWidth, oldHeight); } } }
3、布局文件
把布局文件的根目录修改为步骤2定义的布局
<?xml version="1.0" encoding="utf-8"?> <com.myscroll.ResizeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/rl_scroll" android:layout_width="match_parent" android:layout_height="match_parent" > </com.myscroll.ResizeLayout>
4、在需要监听软键盘的活动类中实现自己的功能
ResizeLayout rl_layout = (ResizeLayout) findViewById(R.id.rl_scroll); rl_layout.setOnResizeListener(new ResizeLayout.OnResizeListener() { public void OnResize(int w, int h, int oldw, int oldh) { //键盘关闭 if(h > oldh+100){ }else if(h < oldh-100){ //键盘打开 }}});
就写这么多了,有问题的地方希望大家指正,相互交流。
以下是参考的两篇博客:
http://blog.csdn.net/breeze666/article/details/27082419
http://www.tuicool.com/articles/Abyiqa