android:windowSoftInputMode属性一共有9个取值,分别是:
stateUnspecified,stateUnchanged,stateHidden,stateAlwaysHidden,stateVisible,stateAlwaysVisible,adjustUnspecified,adjustResize,adjustPan。
android:fitsSystemWindows="true"
(1).stateUnspecified(未指定状态)
中文意思是未指定状态,当我们没有设置android:windowSoftInputMode属性的时候,软件默认采用的就是这种交互方式(stateUnspecified),系统会根据界面采取相应的软键盘的显示模式,比如,当界面上只有文本和按钮的时候,软键盘就不会自动弹出,因为没有输入的必要。那么,当界面上出现了获取了焦点的输入框的时候,软键盘会不会自动的弹出呢?这个还真不一定!比如,在下面的这个界面布局中,软键盘并不会自动弹出(因为虽然获取了焦点但是不确定是要否要输入)。
代码1(不会自动弹出软键盘,除非点击了EditText)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <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" android:hint="请输入内容" /> </LinearLayout> </LinearLayout>
代码2(自动弹出软键盘)
<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:focusable="true" android:text="跳转" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入内容"/> </LinearLayout> </ScrollView> </LinearLayout>
就是说,默认的,在这种界面情况下,系统并不确定用户是否需要软键盘,因此不会自动弹出。但是,为什么说不一定呢?这是因为,如果我们在这个布局的外面,包裹上一个
ScrollView,软键盘就会自动的弹出来了!这是如果要避免这种情况就是在布局中其他控件获得焦点,或者EditText失去焦点(设置focusable,或者Activity中设置
android:windowSoftInputMode="stateHidden")
2.stateUnchanged(当前页面的软键盘跟上一个页面的软键盘保持一样的状态)
中文的意思就是状态不改变的意思,我们应该怎么理解这句话呢?其实很好理解,就是说,当前界面的软键盘状态,取决于上一个界面的软键盘状态。举个例子,假如当前界面键盘是隐藏的,那么跳转之后的界面,软键盘也是隐藏的;如果当前界面是显示的,那么跳转之后的界面,软键盘也是显示状态。
3.stateHidden
顾名思义,如果我们设置了这个属性,那么键盘状态一定是隐藏的,不管上个界面什么状态,也不管当前界面有没有输入的需求,反正就是不显示。因此,我们可以设置这个属性,来控制软键盘不自动的弹出。
4.stateAlwaysHidden
不确定跟上面的有什么区别,暂时效果一样
5.stateVisible
设置为这个属性,可以将软键盘召唤出来,即使在界面上没有输入框的情况下也可以强制召唤出来(什么都不用点,一切到设置这个属性的页面,软键盘就弹出来了)
6.stateAlwaysVisible
不确定跟上面的有什么区别,暂时效果一样
7.adjustUnspecified(设置软键盘与软件的显示内容之间的显示关系)
当我们没有设置这个值的时候,这个选项也是默认的设置模式。
(1)如果界面里面有可以滚动的控件,比如ScrowView,系统会减小可以滚动的界面的大小,从而保证即使软键盘显示出来了,也能够看到所有的内容。
(2)如果布局里面没有滚动的控件,那么软键盘可能就会盖住一些内容,我们从下面的图中可以看出差别。
没有滚动控件,软键盘下面的布局都被遮挡住了,若想修改,只能隐藏软键盘,然后选择。而且,重点注意一下上面的布局,当我们选择的输入框偏下的时候,上面的标题栏和布局被软键盘顶上去了。记住这个特征,因为后面有个属性和这个的效果不一样。
(其实设置这个adjustUnspecified貌似没什么软用,而且又没有scrollView该被遮挡还是会被遮挡,并没有什么变化)
8.adjustResize如果不设置默认选择edittext的时候如果被遮挡了,就会网上顶 ,如果设置了,不会往上顶(原来布局是什么样,就是什么样),但是如果套了个scrollView就跟没设置的效果一样
9.adjustPan
如果设置为这个属性,那么Activity的屏幕大小并不会调整来保证软键盘的空间,而是采取了另外一种策略,系统会通过布局的移动,来保证用户要进行输入的输入框肯定在用户的失业范围里面,从而让用户可以看到自己输入的内容。对于没有滚动控件的布局来说,这个其实就是默认的设置,如果我们选择的位置偏下,上面的标题栏和部分控件会被顶上去。
但是对于有滚动控件的布局来说,则不太一样,我们看下面的效果图。
如果有滚动的控件包裹,设置了这个属性,就不能滑动页面(相当于什么都不设置的没有滚动控件的布局)