背景:
在很多App开发过程中需要在Activity中监听Android设备的软键盘弹起与关闭,但是Android似乎没有提供相关的的监听API给我们来调用,本文提供了一个可行的办法来监听软键盘的弹起与关闭。

预备知识:
在manifest文件中可以设置Activity的android:windowSoftInputMode属性,这个属性值常见的设置如下:
android:windowSoftInputMode=”stateAlwaysHidden|adjustPan”
那么这里值的含义列表如下:
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

示例:
(1)首先我们需要将监听所在的Activity在Manifest文件中的设置为如下形式:

<activity      android:name="com.bear.softkeyboardlistener.MainActivity"      android:label="@string/app_name"      android:windowSoftInputMode="stateAlwaysHidden|adjustResize" >      <intent-filter>          <action android:name="android.intent.action.MAIN" />          <category android:name="android.intent.category.LAUNCHER" />      intent-filter>  activity>  

这样设置之后,当有软键盘弹起来的时候,Activity的布局大小会被压缩上去,但是你仍然可以通过滑动浏览所有。

(2)我们要为Activity的最外面的Layout设置一个OnLayoutChangeListener监听器:

public class MainActivity extends Activity implements OnLayoutChangeListener{      //Activity最外层的Layout视图      private View activityRootView;      //屏幕高度      private int screenHeight = 0;      //软件盘弹起后所占高度阀值      private int keyHeight = 0;      @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          activityRootView = findViewById(R.id.root_layout);          //获取屏幕高度          screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();          //阀值设置为屏幕高度的1/3          keyHeight = screenHeight/3;      }      @Override      protected void onResume() {          super.onResume();          //添加layout大小发生改变监听器          activityRootView.addOnLayoutChangeListener(this);      }      @Override      public void onLayoutChange(View v, int left, int top, int right,              int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {          //old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值  //      System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);  //      System.out.println(left + " " + top +" " + right + " " + bottom);          //现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘弹起          if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){              Toast.makeText(MainActivity.this, "监听到软键盘弹起...", Toast.LENGTH_SHORT).show();          }else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){              Toast.makeText(MainActivity.this, "监听到软件盘关闭...", Toast.LENGTH_SHORT).show();          }      }  

更多相关文章

  1. Android如何监听开机广播和关机广播
  2. android EditText中的inputType
  3. Android(安卓)inputType ,软键盘输入类型
  4. Android键盘系统
  5. Android应用程序键盘(Keyboard)消息处理机制分析(25)
  6. Android(安卓)EditText 自动获取焦点,并弹出键盘
  7. android RadioGroup的使用
  8. Android中短信拦截解决方案
  9. Android自动弹出软键盘(输入键盘)

随机推荐

  1. Android(安卓)java.lang.StackOverflowEr
  2. Android(安卓)编译命令及选项
  3. NDK DEBUG方法
  4. Android课程---Android(安卓)Studio的一
  5. 如何在MSM中实现Android震动系统
  6. Android开发之异步详解(二)之AsyncTask
  7. setContentView( )方法
  8. Handler, Looper, MessageQueue, Message
  9. android mvp快速开发框架介绍(开始dileber
  10. Android常用UI之Spinner