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

需求:

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

实现:

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

  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);}
    原文作者:JJoom
    原文地址: https://www.jianshu.com/p/dbd26e8c0439
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞