Android监听软键盘弹出与隐藏的两种方法

 更新时间:2017年04月20日 10:30:23   作者:JJoom  
本篇文章主要介绍了Android监听软键盘弹出与隐藏的两种方法,非常具有实用价值,需要的朋友可以参考下

需求:

现在有一个需求是点击一行文本框,弹出一个之前隐藏的输入框,输入完成后按返回键或者其他的东西隐藏键盘和输入框,将输入框的内容填充到文本框中。

实现:

拿到这个需求的第一反应就是写一个监听来监听键盘的显示和隐藏来控制输入框的显示和隐藏,控制文本框中的内容。
所以我做了如下操作:

  1. 指定android:windowSoftInputMode="adjustResize|stateAlwaysHidden"这个的做法是为了让键盘弹出时改变布局。
  2. 让Activity实现LayoutchangeListener,监听布局的改变,当布局发生的改变为屏幕的1/3时我们认为是键盘导致的。
@Override 
 public void onLayoutChange(View v, int left, int top, int right, 
     int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 

   //old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值 

   //现在认为只要控件将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(); 

   } 

 }

问题:

没错,这样确实是能够做到监听软键盘的弹出和隐藏,这一切都是因为之前设置了indowSoftInputMode=adjustResize,但是当全屏模式下是这个属性是无效的,键盘弹出和隐藏并不会触发onLayouChangeListener。

而项目中使用了SystemBarTintManager之后,Activity就变成了全屏模式所以我做了如下操作

//contentlayout是最外层布局
mChildOfContent = contentlayout.getChildAt(0);
mChildOfContent.getViewTreeObserver()
.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {  
   public void onGlobalLayout() {    
       possiblyResizeChildOfContent();  
}});

private void possiblyResizeChildOfContent() {  
int usableHeightNow = computeUsableHeight();  
if (usableHeightNow != usableHeightPrevious) {    
   int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();    
   int heightDifference = usableHeightSansKeyboard - usableHeightNow;    
   if (heightDifference > (usableHeightSansKeyboard / 4)) {      
   // 键盘弹出    
   } else {      
   // 键盘收起      
   productInfo.setVisibility(View.GONE);      
   productInfoEnd.setText(productInfo.getText().toString());    
}    
   mChildOfContent.requestLayout();    
    usableHeightPrevious = usableHeightNow;  
}
}
private int computeUsableHeight() {  
 Rect r = new Rect();  
mChildOfContent.getWindowVisibleDisplayFrame(r);  
return (r.bottom - r.top);}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android编程实用技术小结

    Android编程实用技术小结

    这篇文章主要介绍了Android编程实用技术,实例汇总了开机启动receiver、service使用、AlarmManager发送广播及停止AlarmManager等相关技巧,需要的朋友可以参考下
    2016-01-01
  • Android中RecyclerView实现多级折叠列表效果(TreeRecyclerView)

    Android中RecyclerView实现多级折叠列表效果(TreeRecyclerView)

    RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,下面这篇文章主要给大家介绍了Android中RecyclerView实现多级折叠列表效果(TreeRecyclerView)的相关资料,文中介绍的非常详细,需要的朋友可以参考下。
    2017-05-05
  • 浅谈Android解决65535问题的方法

    浅谈Android解决65535问题的方法

    下面小编就为大家分享一篇浅谈Android解决65535问题的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • OkHttp3中默认不保持Cookie的解决方法

    OkHttp3中默认不保持Cookie的解决方法

    这篇文章主要给大家介绍了关于OkHttp3中默认不保持Cookie的解决方法,文中先对OKhttp3中的cookies进行了简单的介绍,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • 获取Android签名MD5的方式实例详解

    获取Android签名MD5的方式实例详解

    平时开发,很多第三方需要配置应用签名,比如百度,高德地图等,下面这篇文章主要给大家介绍了关于获取Android签名MD5的方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Android内存优化杂谈

    Android内存优化杂谈

    这篇文章主要介绍了Android内存优化的方法,重点介绍优化RAM,即降低运行时内存,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • 基于Android Kotlin高频面试题解析

    基于Android Kotlin高频面试题解析

    这篇文章主要为大家介绍了基于Android Kotlin高频面试题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Android自定义View实现圆形切图效果

    Android自定义View实现圆形切图效果

    这篇文章主要为大家详细介绍了Android自定义View实现圆形切图效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • android获取附近蓝牙设备并计算距离的实例代码

    android获取附近蓝牙设备并计算距离的实例代码

    下面小编就为大家分享一篇android获取附近蓝牙设备并计算距离的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Android SharedPreferences存储的正确写法

    Android SharedPreferences存储的正确写法

    这篇文章主要介绍了Android SharedPreferences存储的正确写法的相关资料,需要的朋友可以参考下
    2017-06-06

最新评论