1.我们在项目中经常会遇到软键盘遮挡页面,输入框或者软键盘自动弹出的场景,在Android中Activity给我们提供了一个属性<b>”windowSoftInputMode“</b>,专治输入法对布局造成一系列的影响,我们只需要在<b>AndroidManifest.xml</b>文件中的activity中设置android:windowSoftInputMode属性可以很好解决上面所说的问题。
<activity android:name=".SecondActivity"
android:windowSoftInputMode="属性值"/>
2.windowSoftInputMode属性的取值:
该属性一共有<b>9种</b>取值,分别为:
- stateUnspecified
- stateUnchanged
- stateHidden
- stateAlwaysHidden
- stateVisible
- stateAlwaysVisible
- adjustUnspecified
- adjustResize
- adjustPan。
下面通过例子来演示每个属性值的作用
第一部分:设置软键盘的显示与隐藏
1.stateUnspecified
中文意思是未指定状态,Activity默认采用的就是这种交互方式,系统会根据界面采取相应的软键盘的显示模式,当界面上只有文本和按钮的时候,软键盘就不会自动弹出,因为没有输入的必要;当界面上出现了获取了焦点的输入框的时候,又分为两种情况:
- 1.第一种:有可输入的控件,但是页面不能滚动(不能自动弹出,需要点击输入框)

- 2.第二种:有可输入的控件并且页面可以滚动(能够自动弹出)在上面的基础上在布局中加上一个ScrollView,是页面能够滚动

因此,我们可以得出结论,当设置属性为<b>stateUnspecified</b>的时候,系统是默认不弹出软键盘的,但是当有获得焦点的输入框的界面有滚动的需求的时候,会自动弹出软键盘。至于为什么非要强调要获取焦点的输入框,这是因为,如果不是输入框获取焦点,软键盘也是不会自动弹出的,让界面不自动弹出软键盘的其中一个解决方案,就是在xml文件中,设置一个非输入框控件获取焦点,从而阻止键盘弹出。
2.stateUnchanged
中文的意思就是状态不改变的意思,作用就是当前界面的软键盘状态,取决于上一个界面的软键盘状态。也就是说假如当前界面键盘是隐藏的,那么跳转之后的界面,软键盘也是隐藏的;如果当前界面是显示的,那么跳转之后的界面,软键盘也是显示状态。
<!-- 第一个Actiivty为默认的,页面能够滚动-->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 第二个Activity:软件盘状态跟随上一个页面-->
<activity android:name=".SecondActivity"
android:windowSoftInputMode="stateUnchanged"/>

设置为该属性,软键盘的状态会跟着上一个页面走,即使当前的页面没有可输入的控件。
3.stateHidden
顾名思义,如果我们设置了这个属性,那么键盘状态一定是隐藏的,不管上个界面什么状态,也不管当前界面有没有输入的需求,反正就是不显示。因此,我们可以设置这个属性,来控制软键盘不自动的弹出
<!-- 第二个Activity:隐藏软键盘-->
<activity android:name=".SecondActivity"
android:windowSoftInputMode="stateHidden"/>

4.stateAlwaysHidden
这个属性也可以让软键盘隐藏,目前测试跟stateHidden的效果一样,还没有测试出两者的区别。
5.stateVisible
设置为这个属性,可以强制将软键盘出来,即使在界面上没有输入框的情况下。
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.yt.demo.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="没有可输入的控件"
android:gravity="center"/>
</LinearLayout>

6.stateAlwaysVisible
这个属性也是可以将键盘强制显示出来,与stateVisible属性不同之处在于:当我们设置为stateVisible属性,如当我们点击按钮跳转到下个界面的时候,软键盘会因为输入框失去焦点而隐藏起来,当我们再次回到当前界面的时候,键盘这个时候是隐藏的。但是如果我们设置为stateAlwaysVisible,我们跳转到下个界面,再次回来的时候,软键盘是会显示出来的。
<activity android:name=".MainActivity"
android:windowSoftInputMode="stateAlwaysVisible">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity" />

第二部分:设置软键盘与显示内容间的关系
1.adjustUnspecified
该属性是默认的设置模式。在这中情况下,系统会根据界面选择不同的模式。如果界面里面有可以滚动的控件,比如ScrowView,系统会减小可以滚动的界面的大小,从而保证即使软键盘显示出来了,也能够看到所有的内容。如果布局里面没有滚动的控件,那么软键盘可能就会盖住一些内容


如果没有滚动控件,当可输入的控件在上面时,软件盘会遮挡内容;当可输入的控件在下面时,内容被顶上去了,同时标题栏也被顶上去了


如果有滚动控件,当可输入的控件在上面时,系统会减小可以滚动的界面的大小,从而保证即使软键盘显示出来了同时内容可以滚动显示出来;当可输入的控件在下面时,内容被顶上去了,但是标题栏没有被顶上去。
2.adjustResize
这个属性表示Activity的主窗口总是会被调整大小,从而保证软键盘显示空间。它跟adjustUnspecified的区别就在于当页面可滚动并且可输入控件在下面的时候,内容被顶上去了,但是标题栏没有被顶上去。

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


只要可输入控件在上面,不管能否滚动,软件盘都会遮挡部分内容的


只要可输入控件在下面,不管能否滚动,内容和标题栏都会被顶上去的。
第三部分:关于使用
上面第一部分介绍了软件盘的显示与隐藏,第二部分介绍了软件盘与内容之间的显示关系,一般我们在使用的时候都是结合二者使用的。
android:windowSoftInputMode="【A】|【B】"//A:为显示属性 B:为关系属性
网友评论