Android进阶Android开发Android开发技术

输入法与窗口交互

2017-05-26  本文已影响49人  慕涵盛华

1.我们在项目中经常会遇到软键盘遮挡页面,输入框或者软键盘自动弹出的场景,在Android中Activity给我们提供了一个属性<b>”windowSoftInputMode“</b>,专治输入法对布局造成一系列的影响,我们只需要在<b>AndroidManifest.xml</b>文件中的activity中设置android:windowSoftInputMode属性可以很好解决上面所说的问题。

<activity android:name=".SecondActivity"
        android:windowSoftInputMode="属性值"/>

2.windowSoftInputMode属性的取值:
该属性一共有<b>9种</b>取值,分别为:

第一部分:设置软键盘的显示与隐藏

1.stateUnspecified

中文意思是未指定状态,Activity默认采用的就是这种交互方式,系统会根据界面采取相应的软键盘的显示模式,当界面上只有文本和按钮的时候,软键盘就不会自动弹出,因为没有输入的必要;当界面上出现了获取了焦点的输入框的时候,又分为两种情况:

stateUnspecified

因此,我们可以得出结论,当设置属性为<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"/>
stateUnchanged

设置为该属性,软键盘的状态会跟着上一个页面走,即使当前的页面没有可输入的控件。

3.stateHidden

顾名思义,如果我们设置了这个属性,那么键盘状态一定是隐藏的,不管上个界面什么状态,也不管当前界面有没有输入的需求,反正就是不显示。因此,我们可以设置这个属性,来控制软键盘不自动的弹出

 <!-- 第二个Activity:隐藏软键盘-->
 <activity android:name=".SecondActivity"
        android:windowSoftInputMode="stateHidden"/>
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>
stateVisible

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" />
stateAlwaysVisible

第二部分:设置软键盘与显示内容间的关系

1.adjustUnspecified

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

没有滚动可输入在上方 没有滚动有输入在下方

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

有滚动可输入在上方 有滚动可输入在下方

如果有滚动控件,当可输入的控件在上面时,系统会减小可以滚动的界面的大小,从而保证即使软键盘显示出来了同时内容可以滚动显示出来;当可输入的控件在下面时,内容被顶上去了,但是标题栏没有被顶上去。

2.adjustResize

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

可滚动有输入在下方

3.adjustPan

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

不能滚动在上面 能滚动在上面

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

不能滚动在下面 能滚动在下面

只要可输入控件在下面,不管能否滚动,内容和标题栏都会被顶上去的。

第三部分:关于使用

上面第一部分介绍了软件盘的显示与隐藏,第二部分介绍了软件盘与内容之间的显示关系,一般我们在使用的时候都是结合二者使用的。

android:windowSoftInputMode="【A】|【B】"//A:为显示属性 B:为关系属性
上一篇下一篇

猜你喜欢

热点阅读