当前位置:操作系统 > 安卓/Android >>

Android 软键盘监听事件

                   Android软键盘的隐藏显示研究
Android是一个针对触摸屏专门设计的操作系统,当点击编辑框,系统自动为用户弹出软键盘,以便用户进行输入。
    那么,弹出软键盘后必然会造成原有布局高度的减少,那么系统应该如何来处理布局的减少?我们能否在应用程序中进行自定义的控制?这些是本文要讨论的重点。

    一、软键盘显示的原理
    软件盘的本质是什么?软键盘其实是一个Dialog!
    InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示。当我们点击输入框时,系统对活动主窗口进行调整,从而为输入法腾出相应的空间,然后将该Dialog显示在底部,或者全屏显示。
    二、活动主窗口调整
    android定义了一个属性,名字为windowSoftInputMode, 用它可以让程序可以控制活动主窗口调整的方式。我们可以在AndroidManifet.xml中对Activity进行设置。如:android:windowSoftInputMode="stateUnchanged|adjustPan"
    该属性可选的值有两部分,一部分为软键盘的状态控制,另一部分是活动主窗口的调整。前一部分本文不做讨论,请读者自行查阅android文档。
    模式一,压缩模式
    windowSoftInputMode的值如果设置为adjustResize,那么该Activity主窗口总是被调整大小以便留出软键盘的空间。
我们通过一段代码来测试一下,当我们设置了该属性后,弹出输入法时,系统做了什么。
    重写Layout布局:
 
源码打印?
1. public class ResizeLayout extends LinearLayout{  
  2.     private static int count = 0;  
  3.       
  4.     public ResizeLayout(Context context, AttributeSet attrs) {  
  5.         super(context, attrs);  
  6.     }  
  7.       
  8.     @Override  
  9.     protected void onSizeChanged(int w, int h, int oldw, int oldh) {      
 10.         super.onSizeChanged(w, h, oldw, oldh);  
 11.           
 12.         Log.e("onSizeChanged " + count++, "=>onResize called! w="+w + ",h="+h+",oldw="+oldw+",oldh="+oldh);  
 13.     }  
 14.       
 15.     @Override  
 16.     protected void onLayout(boolean changed, int l, int t, int r, int b) {  
 17.         super.onLayout(changed, l, t, r, b);  
 18.         Log.e("onLayout " + count++, "=>OnLayout called! l=" + l + ", t=" + t + ",r=" + r + ",b="+b);  
 19.     }  
 20.       
 21.     @Override  
 22.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
 23.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
 24.           
 25.         Log.e("onMeasure " + count++, "=>onMeasure called! widthMeasureSpec=" + widthMeasureSpec + ", heightMeasureSpec=" + heightMeasureSpec);  
 26.     }  

    我们的布局设置为:
 
源码打印?
1. <com.winuxxan.inputMethodTest.ResizeLayout   
   2.     xmlns:android="http://schemas.android.com/apk/res/android"  
   3.     android:id="@+id/root_layout"  
   4.     android:layout_width="fill_parent"  
   5.     android:layout_height="fill_parent"  
   6.     android:orientation="vertical"  
   7.     >  
   8.       
   9.     <EditText  
  10.         android:layout_width="fill_parent"   
  11.         android:layout_height="wrap_content"   
  12.     />  
  13.     
  14.     <LinearLayout  
  15.             android:id="@+id/bottom_layout"  
  16.             android:layout_width="fill_parent"   
  17.             android:layout_height="fill_parent"   
  18.             android:orientation="vertical"  
  19.             android:gravity="bottom">s  
  20.      
  21.     <TextView    
  22.         android:layout_width="fill_parent"   
  23.         android:layout_height="wrap_content"   
  24.         android:text="@string/hello"  
  25.         android:background="#77777777"  
  26.       />  
  27.    </LinearLayout>  
  28. </com.winuxxan.inputMethodTest.ResizeLayout>  

    AndroidManifest.xml的Activity设置属性:android:windowSoftInputMode = "adjustResize"
    运行程序,点击文本框,查看调试信息:
    E/onMeasure 6(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742024
    E/onMeasure 7(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742025
    E/onSizeChanged 8(7960): =>onSizeChanged called! w=320,h=201,oldw=320,oldh=377
    E/onLayout 9(7960): =>OnLayout called! l=0, t=0,r=320,b=201
    从调试结果我们可以看出,当我们点击文本框后,根布局调用了onMeasure,onSizeChanged和onLayout。
    实际上,当设置为adjustResize后,软键盘弹出时,要对主窗口布局重新进行measure和layout,而在layout时,发现窗口的大小发生的变化,因此调用了onSizeChanged。
&n

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,