背景:
在很多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 inputType ,软键盘输入类型
  3. Android屏幕密度(Density)和分辨率的关系
  4. Android应用程序键盘(Keyboard)消息处理机制分析(25)
  5. 【Android Demo】Android中取得手机屏幕大小
  6. Android之手机屏幕朝向
  7. Android EditText 自动获取焦点,并弹出键盘
  8. edittext 随文字换行 而高度增加
  9. Android自动弹出软键盘(输入键盘)

随机推荐

  1. 深入学习 Java 线程池
  2. Java 程序员应该知道的 10 个面向对象理
  3. 阻塞队列实现生产者消费者模式
  4. 避免 Java 应用中 NullPointerException
  5. 数据库两大神器【索引和锁】
  6. 从惰性IO说起_Haskell笔记6
  7. JVM如何从入门到放弃的?
  8. Java多线程打辅助的三个小伙子
  9. 利用 Lambda 表达式实现 Java 中的惰性求
  10. Monoid_Haskell笔记9