Android是一个针对触摸屏专门设计的操作系统,当点击编辑框,系统自动为用户弹出软键盘,以便用户进行输入。
那么,弹出软键盘后必然会造成原有布局高度的减少,那么系统应该如何来处理布局的减少?我们能否在应用程序中进行自定义的控制?这些是本文要讨论的重点。
一、软键盘显示的原理
软件盘的本质是什么?软键盘其实是一个Dialog!
InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示。当我们点击输入框时,系统对活动主窗口进行调整,从而为输入法腾出相应的空间,然后将该Dialog显示在底部,或者全屏显示。
二、活动主窗口调整
android定义了一个属性,名字为windowSoftInputMode, 用它可以让程序可以控制活动主窗口调整的方式。我们可以在AndroidManifet.xml中对Activity进行设置。如:android:windowSoftInputMode="stateUnchanged|adjustPan"
该属性可选的值有两部分,一部分为软键盘的状态控制,另一部分是活动主窗口的调整。前一部分本文不做讨论,请读者自行查阅android文档。
模式一,压缩模式
windowSoftInputMode的值如果设置为adjustResize,那么该Activity主窗口总是被调整大小以便留出软键盘的空间。
我们通过一段代码来测试一下,当我们设置了该属性后,弹出输入法时,系统做了什么。
重写Layout布局:
1.publicclassResizeLayoutextendsLinearLayout{
2.privatestaticintcount =0;
3.
4.publicResizeLayout(Context context, AttributeSet attrs) {
5.super(context, attrs);
6. }
7.
8.@Override
9.protectedvoidonSizeChanged(intw,inth,intoldw,intoldh) {
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.protectedvoidonLayout(booleanchanged,intl,intt,intr,intb) {
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.protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec) {
23.super.onMeasure(widthMeasureSpec, heightMeasureSpec);
24.
25. Log.e("onMeasure "+ count++,"=>onMeasure called! widthMeasureSpec="+ widthMeasureSpec +", heightMeasureSpec="+ heightMeasureSpec);
26. }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="