关于EditText的焦点和软键盘开关的一些总结

一. 相关API

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的屏幕大小并不会调整来保证软键盘的空间,而是采取了另外一种策略,系统会通过布局的移动,来保证用户要进行输入的输入框肯定在用户的失业范围里面,从而让用户可以看到自己输入的内容。对于没有滚动控件的布局来说,这个其实就是默认的设置,如果我们选择的位置偏下,上面的标题栏和部分控件会被顶上去。

但是对于有滚动控件的布局来说,则不太一样,我们看下面的效果图。

如果有滚动的控件包裹,设置了这个属性,就不能滑动页面(相当于什么都不设置的没有滚动控件的布局)




你可能感兴趣的:(关于EditText的焦点和软键盘开关的一些总结)