android:windowSoftInputMode属性具体解释

2018-12-16 12:12:12

    在前面的一篇文章中,简单的介绍了一下怎样实现软键盘不自己主动弹出,使用的方法是设置android:windowSoftInputMode属性。

那么,这个属性究竟是干什么的,他有什么作用呢?今天这篇文章。就是探索android:windowSoftInputMode属性的作用的。


    首先,我们从这个属性的名称中,能够非常直观的看出它的作用,这个属性就是来设置窗体软键盘的交互模式的。


    android:windowSoftInputMode属性一共同拥有9个取值。各自是:

    stateUnspecified,stateUnchanged。stateHidden,stateAlwaysHidden。stateVisible,stateAlwaysVisible,adjustUnspecified,adjustResize。adjustPan。

    我们设置属性的时候。能够在这9个值里面选择一个。也能够用"state...|adjust"的形式进行设置。那么,这些取值究竟是怎么影响到软键盘与窗体之间的交互的呢?以下。我们就一个个的測试这9个取值。究竟是怎样影响软键盘的显示的。

    1.stateUnspecified

    中文意思是未指定状态,当我们没有设置android:windowSoftInputMode属性的时候,软件默认採用的就是这样的交互方式,系统会依据界面採取对应的软键盘的显示模式。比方。当界面上仅仅有文本和button的时候,软键盘就不会自己主动弹出。由于没有输入的必要。

那么。当界面上出现了获取了焦点的输入框的时候。软键盘会不会自己主动的弹出呢?这个还真不一定!

比方,在以下的这个界面布局中。软键盘并不会自己主动弹出。




    就是说。默认的,在这样的界面情况下,系统并不确定用户是否须要软键盘,因此不会自己主动弹出。

可是,为什么说不一定呢?这是由于,假设我们在这个布局的外面,包裹上一个

ScrollView,软键盘就会自己主动的弹出来了!


    例如以下,在这样的布局文件下,软键盘会自己主动的弹出


<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:text="跳转" />

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </ScrollView>

</LinearLayout>

   这确实是一个非常奇怪的推断方式。因此,我们能够得出结论,当设置属性为stateUnspecified的时候,系统是默认不弹出软键盘的。可是当有获得焦点的输入框的界面有滚动的需求的时候,会自己主动弹出软键盘。至于为什么非要强调要获取焦点的输入框。这是由于,假设不是输入框获取焦点。软键盘也是不会自己主动弹出的。让界面不自己主动弹出软键盘的当中一个解决方式,就是在xml文件里。设置一个非输入框控件获取焦点,从而阻止键盘弹出。





    2.stateUnchanged

    中文的意思就是状态不改变的意思。我们应该怎么理解这句话呢?事实上非常好理解,就是说,当前界面的软键盘状态,取决于上一个界面的软键盘状态。举个样例,假如当前界面键盘是隐藏的,那么跳转之后的界面,软键盘也是隐藏的;假设当前界面是显示的,那么跳转之后的界面,软键盘也是显示状态。


    3.stateHidden

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


    4.stateAlwaysHidden

    这个属性也能够让软键盘隐藏,可是我临时还不知道和stateHidden属性的差别,本来想去stackOverFlow上问一下的,可是,Great Wall,呵呵呵...祝愿病魔早日战胜方校长

    

    5.stateVisible

    设置为这个属性,能够将软键盘召唤出来,即使在界面上没有输入框的情况下也能够强制召唤出来。


    6.stateAlwaysVisible

    这个属性也是能够将键盘召唤出来,可是与stateVisible属性有小小的不同之处。举个样例,当我们设置为stateVisible属性,假设当前的界面键盘是显示的,当我们点击button跳转到下个界面的时候,软键盘会由于输入框失去焦点而隐藏起来,当我们再次回到当前界面的时候,键盘这个时候是隐藏的。可是假设我们设置为stateAlwaysVisible,我们跳转到下个界面,软键盘还是隐藏的,可是当我们再次回来的时候。软键盘是会显示出来的。

所以。这个Always就解释了这个差别,无论什么情况到达当前界面(正常跳转或者是上一个界面被用户返回)。软键盘都是显示状态。


    讲到这里。我联想到了上面的stateHidden和stateAlwaysHidden。我预计差别也是这种。就是说。stateAlwaysHidden不管怎样都是隐藏的,可是假设在跳转到下个界面的时候。软键盘被召唤出来了。那么当下个界面被用户返回的时候,键盘应该是不会被隐藏的,可是,我还没有找到可以跳转到下个界面,还让当前界面软键盘不消失的方法。所以临时不能验证。

    

    7.adjustUnspecified

    从这个属性開始。就不是设置软键盘的显示与隐藏模式了,而是设置软键盘与软件的显示内容之间的显示关系。当你跟我们没有设置这个值的时候,这个选项也是默认的设置模式。在这中情况下,系统会依据界面选择不同的模式。假设界面里面有能够滚动的控件,比方ScrowView。系统会减小能够滚动的界面的大小,从而保证即使软键盘显示出来了,也能够看到全部的内容。假设布局里面没有滚动的控件。那么软键盘可能就会盖住一些内容,我们从以下的图中能够看出区别。



    没有滚动控件,软键盘以下的布局都被遮挡住了,若想改动,仅仅能隐藏软键盘。然后选择。并且,重点注意一下上面的布局,当我们选择的输入框偏下的时候,上面的标题栏和布局被软键盘顶上去了。

记住这个特征,由于后面有个属性和这个的效果不一样。


   

    布局里面有滑动控件,系统会自己主动的缩小整个界面的大小。因此,我们能够软键盘上面的小区域中显示全部的输入框。


 


    这就是两中显示模式之间的区别。



    8.adjustResize

    这个属性表示Activity的主窗体总是会被调整大小,从而保证软键盘显示空间。

    我们先看显示效果。


    注意观察这个上面的标题栏和button,设置为adjustResize属性之后,对于没有滑动控件的布局。尽管还是不能选择全部的输入框。可是,窗体的显示方式发生了变化,默认属性时,整个布局是被顶上去了,可是设置为adjustResize属性。布局的位置并没有发生什么变化。这就是最大的差别。




而对于有滑动控件的布局来说,显示效果和默认是一样的。



    9.adjustPan

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


    首先,这是软键盘没有弹出的时候,有滚动控件的显示范围。最以下显示的是9.



    当我们点击5这个输入框,我们会发现以下的现象。


    最上面仅仅可以显示到button,标题栏已经不能看到了。



    而最以下也仅仅能滑动到8,以下的内容也不可以滑动了。



   因此,我们就行理解这个属性的作用了。


    通过以上的实验,我们能够得出结论,假设我们不设置"adjust..."的属性,对于没有滚动控件的布局来说,採用的是adjustPan方式,而对于有滚动控件的布局,则是採用的adjustResize方式。


    了解了上面的这些知识之后,我们就能够依据自己的需求设置不同的方式了。并且。关于怎样使得界面载入的时候不显示软键盘。我们也有了一个非常清楚的认识。

    晚安,在假期里还在奋斗的程序猿们。

  • 2019-03-15 15:49:28

    win10远程桌面连接不上解决方法

    有朋友就感叹电脑的世界真的是很神奇,可以将整个世界连接在一起。如果别人想要摆弄你的电脑,即使不在一个地方也可以利用远程桌面来控制。而这就是所谓的远程控制操作了,大部分人都知道它的作用,不过这也不排除会遇到一些突发情况的时候,例如win10远程桌面连接不上,这该怎么去解决呢?为此,小编给大家带来了解决的图文操作。

  • 2019-03-15 16:49:18

    Win7无法进入家庭组提示“您的系统管理员不允许访问家庭组”怎么办

     家庭组是家庭网络上可以共享文件和打印机的一组计算机,可以方便用户们共享文件或者视频等,可是最近有win7纯净版系统用户却发现无法进入家庭组,提示“您的系统管理员不允许访问家庭组”,该怎么办呢?现在给大家分享一下Win7无法进入家庭组提示“您的系统管理员不允许访问家庭组”的解决方法。

  • 2019-03-17 22:19:28

    动态更新Toolbar Menu以及Menu中同时显示文字和图标

    我们经常会有这样的需求,在切换Fragment或者点击某个按钮后动态更新Toolbar上Menu项.但是onCreateOptionsMenu方法只在创建Activity的时候调用一次,以后就不再调用了,所以就不能在onCreateOptionsMenu中做处理了。 不过系统提供了另外的一个方法onPrepa

  • 2019-03-26 19:25:01

    Android studio 打包后安装闪退 Fatal Signal 6(SIGABRT)...

    项目上线前打包安装后闪退,查了很多原因,比如混淆文件的内容,第三方库不加入混淆等等,均未成功,后来关闭混淆打包后运行成功,原因可能是依赖工程中的库文件不能被混淆,关闭本工程混淆开关后,依赖工程的混淆开关也要关闭,关闭混淆后如果怕被反编译,可使用百度开发平台的app加固,加固的同时还能使用多渠道打包工具。

  • 2019-03-26 19:29:05

    Android NDK开发Crash错误定位

     在Android开发中,程序Crash分三种情况:未捕获的异常、ANR(Application Not Responding)和闪退(NDK引发错误)。其中未捕获的异常根据logcat打印的堆栈信息很容易定位错误。ANR错误也好查,Android规定,应用与用户进行交互时,如果5秒内没有响应用户的操作,则会引发ANR错误,并弹出一个系统提示框,让用户选择继续等待或立即关闭程序。并会在/data/anr目录下生成一个traces.txt文件,记录系统产生anr异常的堆栈和线程信息。如果是闪退,这问题比较难查, --------------------- 作者:xyang0917 来源:CSDN 原文:https://blog.csdn.net/xyang81/article/details/42319789 版权声明:本文为博主原创文章,转载请附上博文链接!

  • 2019-04-01 22:46:39

    电子签章的实施方案

    WORD/EXCEL签章模块,该部分实现与WORD/EXCEL的无缝结合,并提供给用户简单直观的菜单和工具条来实现文档签章验证等各种操作,其中,KHSC-64智能密码钥匙是签章模块中用户证书和图章的载体

  • 2019-04-01 22:48:25

    如何用 Java 对 PDF 文件进行电子签章

    印章是我国特有的历史文化产物,古代主要用作身份凭证和行驶职权的工具。它的起源是由于社会生活的实际需要。早在商周时代,印章就已经产生。如今的印章已成为一种独特的,融实用性和艺术性为一体的艺术瑰宝。传统的印章容易被坏人、小人私刻;从而新闻鲜有报道某某私刻公章,侵吞国家财产。随着计算机技术、加密技术及图像处理技术的发展,出现了电子签章。电子签章是电子签名的一种表现形式,利用图像处理技术、数字加密技术将电子签名操作转化为与纸质文件盖章操作相同的可视效果,同时利用电子签名技术保障电子信息的真实性和完整性以及签名人的不可否认性