Android中的windowSoftInputMode属性详解

    如何实现软键盘不自动弹出,使用的方法是设置android:windowSoftInputMode属性。那么,这个属性究竟是干什么的,他有什么做用呢?今天这篇文章,就是探索android:windowSoftInputMode属性的做用的。android

    首先,咱们从这个属性的名称中,能够很直观的看出它的做用,这个属性就是来设置窗口软键盘的交互模式的。布局

    android:windowSoftInputMode属性一共有9个取值,分别是:测试

    stateUnspecified,stateUnchanged,stateHidden,stateAlwaysHidden,stateVisible,stateAlwaysVisible,adjustUnspecified,adjustResize,adjustPan。.net


    咱们设置属性的时候,能够在这9个值里面选择一个,也能够用"state...|adjust"的形式进行设置。那么,这些取值究竟是怎么影响到软键盘与窗口之间的交互的呢?下面,咱们就一个个的测试这9个取值,究竟是如何影响软键盘的显示的。3d

    1.stateUnspecifiedcode

    中文意思是未指定状态,当咱们没有设置android:windowSoftInputMode属性的时候,软件默认采用的就是这种交互方式,系统会根据界面采起相应的软键盘的显示模式,好比,当界面上只有文本和按钮的时候,软键盘就不会自动弹出,由于没有输入的必要。那么,当界面上出现了获取了焦点的输入框的时候,软键盘会不会自动的弹出呢?这个还真不必定!好比,在下面的这个界面布局中,软键盘并不会自动弹出。xml



 就是说,默认的,在这种界面状况下,系统并不肯定用户是否须要软键盘,所以不会自动弹出。可是,为何说不必定呢?这是由于,若是咱们在这个布局的外面,包裹上一个htm

ScrollView,软键盘就会自动的弹出来了!blog

以下,在这种布局文件下,软键盘会自动的弹出ci

复制代码 代码以下:

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
 
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
 
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
 
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="toOther"
                android:text="跳转" />
 
            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </ScrollView>
 
< /LinearLayout>

   这确实是一个很奇怪的判断方式。所以,咱们能够得出结论,当设置属性为stateUnspecified的时候,系统是默认不弹出软键盘的,可是当有得到焦点的输入框的界面有滚动的需求的时候,会自动弹出软键盘。至于为何非要强调要获取焦点的输入框,这是由于,若是不是输入框获取焦点,软键盘也是不会自动弹出的,让界面不自动弹出软键盘的其中一个解决方案,就是在xml文件中,设置一个非输入框控件获取焦点,从而阻止键盘弹出。

    2.stateUnchanged

    中文的意思就是状态不改变的意思,咱们应该怎么理解这句话呢?其实很好理解,就是说,当前界面的软键盘状态,取决于上一个界面的软键盘状态。举个例子,假如当前界面键盘是隐藏的,那么跳转以后的界面,软键盘也是隐藏的;若是当前界面是显示的,那么跳转以后的界面,软键盘也是显示状态。

    3.stateHidden

    顾名思义,若是咱们设置了这个属性,那么键盘状态必定是隐藏的,无论上个界面什么状态,也无论当前界面有没有输入的需求,反正就是不显示。所以,咱们能够设置这个属性,来控制软键盘不自动的弹出。

    4.stateAlwaysHidden

    这个属性也可让软键盘隐藏,可是我暂时还不知道和stateHidden属性的区别,原本想去stackOverFlow上问一下的,可是,Great Wall,呵呵呵...祝愿病魔早日打败方校长

    5.stateVisible

    设置为这个属性,能够将软键盘召唤出来,即便在界面上没有输入框的状况下也能够强制召唤出来。

    6.stateAlwaysVisible

    这个属性也是能够将键盘召唤出来,可是与stateVisible属性有小小的不一样之处。举个例子,当咱们设置为stateVisible属性,若是当前的界面键盘是显示的,当咱们点击按钮跳转到下个界面的时候,软键盘会由于输入框失去焦点而隐藏起来,当咱们再次回到当前界面的时候,键盘这个时候是隐藏的。可是若是咱们设置为stateAlwaysVisible,咱们跳转到下个界面,软键盘仍是隐藏的,可是当咱们再次回来的时候,软键盘是会显示出来的。因此,这个Always就解释了这个区别,无论什么状况到达当前界面(正常跳转或者是上一个界面被用户返回),软键盘都是显示状态。

    说到这里,我联想到了上面的stateHidden和stateAlwaysHidden,我估计区别也是这样的,就是说,stateAlwaysHidden不管如何都是隐藏的,可是若是在跳转到下个界面的时候,软键盘被召唤出来了,那么当下个界面被用户返回的时候,键盘应该是不会被隐藏的,可是,我尚未找到可以跳转到下个界面,还让当前界面软键盘不消失的方法,因此暂时不能验证。

    7.adjustUnspecified

    从这个属性开始,就不是设置软键盘的显示与隐藏模式了,而是设置软键盘与软件的显示内容之间的显示关系。当你跟咱们没有设置这个值的时候,这个选项也是默认的设置模式。在这中状况下,系统会根据界面选择不一样的模式。若是界面里面有能够滚动的控件,好比ScrowView,系统会减少能够滚动的界面的大小,从而保证即便软键盘显示出来了,也可以看到全部的内容。若是布局里面没有滚动的控件,那么软键盘可能就会盖住一些内容,咱们从下面的图中能够看出差异。

   没有滚动控件,软键盘下面的布局都被遮挡住了,若想修改,只能隐藏软键盘,而后选择。并且,重点注意一下上面的布局,当咱们选择的输入框偏下的时候,上面的标题栏和布局被软键盘顶上去了。记住这个特征,由于后面有个属性和这个的效果不同。


布局里面有滑动控件,系统会自动的缩小整个界面的大小,所以,咱们能够软键盘上面的小区域中显示全部的输入框。

 

    这就是两中显示模式之间的差异。

    8.adjustResize

    这个属性表示Activity的主窗口老是会被调整大小,从而保证软键盘显示空间。

    咱们先看显示效果。

    注意观察这个上面的标题栏和按钮,设置为adjustResize属性以后,对于没有滑动控件的布局,虽然仍是不能选择全部的输入框,可是,窗口的显示方式发生了变化,默认属性时,整个布局是被顶上去了,可是设置为adjustResize属性,布局的位置并无发生什么变化,这就是最大的区别。


而对于有滑动控件的布局来讲,显示效果和默认是同样的。

    9.adjustPan

    若是设置为这个属性,那么Activity的屏幕大小并不会调整来保证软键盘的空间,而是采起了另一种策略,系统会经过布局的移动,来保证用户要进行输入的输入框确定在用户的失业范围里面,从而让用户能够看到本身输入的内容。对于没有滚动控件的布局来讲,这个其实就是默认的设置,若是咱们选择的位置偏下,上面的标题栏和部分控件会被顶上去。可是对于有滚动控件的布局来讲,则不太同样,咱们看下面的效果图。

    首先,这是软键盘没有弹出的时候,有滚动控件的显示范围,最下面显示的是9.


    当咱们点击5这个输入框,咱们会发现下面的现象。

    最上面只可以显示到按钮,标题栏已经不能看到了。


    而最下面也只能滑动到8,下面的内容也不可以滑动了。

   所以,咱们就可以理解这个属性的做用了。

    经过以上的实验,咱们能够得出结论,若是咱们不设置"adjust..."的属性,对于没有滚动控件的布局来讲,采用的是adjustPan方式,而对于有滚动控件的布局,则是采用的adjustResize方式。

    了解了上面的这些知识以后,咱们就能够根据本身的需求设置不一样的方式了。并且,关于如何使得界面加载的时候不显示软键盘,咱们也有了一个很清楚的认识。


来源:http://www.jb51.net/article/56043.htm



相关文章
相关标签/搜索