输入法与窗口交互

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,是页面能够滚动
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:为关系属性
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,967评论 3 119
  • 菜谱凉拌洋葱木耳调料:蚝油、香油、食盐、白糖、食醋、酱油(可以选择性的放点小米椒)做法:将洋葱切成丝(按自己的要求...
    炫藏DJDZ阅读 89评论 0 0
  • 快速完成一个新闻APP 本Demo主要使用的技术: 看标题就知道了 Material Design 聚合数据 效果...
    PageNoFound阅读 629评论 1 7
  • 什么是 CSS hack 由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozill...
    月光下的微笑阅读 139评论 0 0