Android软键盘(六)如何监听到软件盘显示与隐藏的事件,完美实现登录界面

来源:互联网 发布:js获取disabled属性值 编辑:程序博客网 时间:2024/06/05 19:44

结合文章

1.http://blog.csdn.net/hknock/article/details/18667181

2.Android 显示和隐藏软键盘


activity 添加

  1. android:windowSoftInputMode="stateHidden|stateUnchanged"  


有时候我们需要监听软件盘隐藏事件。但是官方并没有提供相关的监听回调,这时我们就需要通过计算布局来判断软键盘的关闭事件了。思路与上一篇文章Android软键盘(五)如何判断软键盘是否显示相似。

看效果图:


有图有证据,不说了,上代码:

[java] view plain copy
  1. @Override  
  2.    protected void onResume() {  
  3.        super.onResume();  
  4.        //获取当前屏幕内容的高度  
  5.        screenHeight = getWindow().getDecorView().getHeight();  
  6.        getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {  
  7.            @Override  
  8.            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {  
  9.                //获取View可见区域的bottom  
  10.                Rect rect = new Rect();  
  11.                getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);  
  12.                if(bottom!=0 && oldBottom!=0 && bottom - rect.bottom <= 0){  
  13.                    Toast.makeText(Main3Activity.this"隐藏", Toast.LENGTH_SHORT).show();  
  14.                }else {  
  15.                    Toast.makeText(Main3Activity.this"弹出", Toast.LENGTH_SHORT).show();  
  16.                }  
  17.            }  
  18.        });  
  19.    }  

可以看出,关键代码都用了上一篇文章写到的。获取屏幕内容高度,并获取当前内容的可见区域的bottom值,再进行计算,那么addOnLayoutChangeListener是什么呢?是一个监听布局重绘的回调,每当这个view被重绘了,onLayout就被回调了。所以每次键盘的弹出和隐藏必然伴随着布局的重绘,所以这个监听必然会被回调,所以在内部再判断一下监听是否在显示即可。我在上述代码中用了bottom - rect.bottom 这样的判断,bottom值代表重绘完成之后这个view的bottom值

上面从图中看出有一个小bug,就是第一次进入界面的时候,也会判断键盘的状态.....这个大家自己想办法屏蔽一下吧,我就懒得弄了。


-------------------------------------------------------------------------------------------------------------------

这里来说一下网上比较流行的大神的做法:

[java] view plain copy
  1. public class MainActivity extends Activity implements OnLayoutChangeListener{    
  2.         
  3.     //Activity最外层的Layout视图    
  4.     private View activityRootView;    
  5.     //屏幕高度    
  6.     private int screenHeight = 0;    
  7.     //软件盘弹起后所占高度阀值    
  8.     private int keyHeight = 0;    
  9.         
  10.     @Override    
  11.     protected void onCreate(Bundle savedInstanceState) {    
  12.         super.onCreate(savedInstanceState);    
  13.         setContentView(R.layout.activity_main);    
  14.     
  15.         activityRootView = findViewById(R.id.root_layout);    
  16.         //获取屏幕高度    
  17.         screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();    
  18.         //阀值设置为屏幕高度的1/3    
  19.         keyHeight = screenHeight/3;    
  20.     }    
  21.         
  22.     @Override    
  23.     protected void onResume() {    
  24.         super.onResume();    
  25.             
  26.         //添加layout大小发生改变监听器    
  27.         activityRootView.addOnLayoutChangeListener(this);    
  28.     }    
  29.         
  30.     @Override    
  31.     public void onLayoutChange(View v, int left, int top, int right,    
  32.             int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {    
  33.             
  34.         //old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值    
  35.             
  36. //      System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);    
  37. //      System.out.println(left + " " + top +" " + right + " " + bottom);    
  38.             
  39.             
  40.         //现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘弹起    
  41.         if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){    
  42.                 
  43.             Toast.makeText(MainActivity.this"监听到软键盘弹起...", Toast.LENGTH_SHORT).show();    
  44.             
  45.         }else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){    
  46.                 
  47.             Toast.makeText(MainActivity.this"监听到软件盘关闭...", Toast.LENGTH_SHORT).show();    
  48.             
  49.         }    
  50.             
  51.     }    

上述原文链接http://blog.csdn.net/bear_huangzhen/article/details/45896333

他是用oldBottom - bottom来判断的,但是经过我的测试,这种做法 只有在界面内有ListView或者ScrollView的情况下才管用,如果界面内没有这种控件,那么键盘的弹出与隐藏,onLayout方法中回调的 oldBottom 和bottom值一直是相等的,无论布局是否上移。所以这是个坑,我看到原文链接一大堆人抱怨不管用,又有一些人说管用,所以我在这里阐述一下,我的那种方法,在哪种情况下都管用。 我在第二篇和第四篇中探讨布局上移的问题就讨论过了,界面存在ListView这种控件和不存在这种类似控件的情况是不一样的,所以出现这种情况很正常。据我测试,如果界面不存在ListView这种控件,弹出和隐藏键盘之后,虽然整个布局上移,下移,但是onLayout方法中bottom和oldBottom一直相等,并且一直和未弹出键盘时一样,所以,呵呵╮(╯▽╰)╭

阅读全文
0 0
原创粉丝点击