`

Android:windowSoftInputMode属性说明

阅读更多
本文章来自CSDN博客:http://blog.csdn.net/zhaokaiqiang1992,转载请注明地址!
    在前面的一篇文章中,简单的介绍了一下如何实现软键盘不自动弹出,使用的方法是设置Android:windowSoftInputMode属性。那么,这个属性到底是干什么的,他有什么作用呢?今天这篇文章,就是探索android:windowSoftInputMode属性的作用的。
    首先,我们从这个属性的名称中,可以很直观的看出它的作用,这个属性就是来设置窗口软键盘的交互模式的。
    android:windowSoftInputMode属性一共有9个取值,分别是:
    stateUnspecified,stateUnchanged,stateHidden,stateAlwaysHidden,stateVisible,stateAlwaysVisible,adjustUnspecified,adjustResize,adjustPan。
    我们设置属性的时候,可以在这9个值里面选择一个,也可以用"state...|adjust"的形式进行设置。那么,这些取值到底是怎么影响到软键盘与窗口之间的交互的呢?下面,我们就一个个的测试这9个取值,到底是如何影响软键盘的显示的。
    1.stateUnspecified
    中文意思是未指定状态,当我们没有设置android:windowSoftInputMode属性的时候,软件默认采用的就是这种交互方式,系统会根据界面采取相应的软键盘的显示模式,比如,当界面上只有文本和按钮的时候,软键盘就不会自动弹出,因为没有输入的必要。那么,当界面上出现了获取了焦点的输入框的时候,软键盘会不会自动的弹出呢?这个还真不一定!比如,在下面的这个界面布局中,软键盘并不会自动弹出。
 
    就是说,默认的,在这种界面情况下,系统并不确定用户是否需要软键盘,因此不会自动弹出。但是,为什么说不一定呢?这是因为,如果我们在这个布局的外面,包裹上一个
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属性,如果当前的界面键盘是显示的,当我们点击按钮跳转到下个界面的时候,软键盘会因为输入框失去焦点而隐藏起来,当我们再次回到当前界面的时候,键盘这个时候是隐藏的。但是如果我们设置为stateAlwaysVisible,我们跳转到下个界面,软键盘还是隐藏的,但是当我们再次回来的时候,软键盘是会显示出来的。所以,这个Always就解释了这个区别,不管什么情况到达当前界面(正常跳转或者是上一个界面被用户返回),软键盘都是显示状态。
    说到这里,我联想到了上面的stateHidden和stateAlwaysHidden,我估计区别也是这样的,就是说,stateAlwaysHidden无论如何都是隐藏的,但是如果在跳转到下个界面的时候,软键盘被召唤出来了,那么当下个界面被用户返回的时候,键盘应该是不会被隐藏的,但是,我还没有找到能够跳转到下个界面,还让当前界面软键盘不消失的方法,所以暂时不能验证。
    
    7.adjustUnspecified
    从这个属性开始,就不是设置软键盘的显示与隐藏模式了,而是设置软键盘与软件的显示内容之间的显示关系。当你跟我们没有设置这个值的时候,这个选项也是默认的设置模式。在这中情况下,系统会根据界面选择不同的模式。如果界面里面有可以滚动的控件,比如ScrowView,系统会减小可以滚动的界面的大小,从而保证即使软键盘显示出来了,也能够看到所有的内容。如果布局里面没有滚动的控件,那么软键盘可能就会盖住一些内容,我们从下面的图中可以看出差别。
    没有滚动控件,软键盘下面的布局都被遮挡住了,若想修改,只能隐藏软键盘,然后选择。而且,重点注意一下上面的布局,当我们选择的输入框偏下的时候,上面的标题栏和布局被软键盘顶上去了。记住这个特征,因为后面有个属性和这个的效果不一样。
    布局里面有滑动控件,系统会自动的缩小整个界面的大小,因此,我们可以软键盘上面的小区域中显示所有的输入框。
    这就是两中显示模式之间的差别。
    8.adjustResize
    这个属性表示Activity的主窗口总是会被调整大小,从而保证软键盘显示空间。
    我们先看显示效果。
    注意观察这个上面的标题栏和按钮,设置为adjustResize属性之后,对于没有滑动控件的布局,虽然还是不能选择所有的输入框,但是,窗口的显示方式发生了变化,默认属性时,整个布局是被顶上去了,但是设置为adjustResize属性,布局的位置并没有发生什么变化,这就是最大的区别。
    9.adjustPan
    如果设置为这个属性,那么Activity的屏幕大小并不会调整来保证软键盘的空间,而是采取了另外一种策略,系统会通过布局的移动,来保证用户要进行输入的输入框肯定在用户的失业范围里面,从而让用户可以看到自己输入的内容。对于没有滚动控件的布局来说,这个其实就是默认的设置,如果我们选择的位置偏下,上面的标题栏和部分控件会被顶上去。但是对于有滚动控件的布局来说,则不太一样,我们看下面的效果图。
   因此,我们就能够理解这个属性的作用了。
    通过以上的实验,我们可以得出结论,如果我们不设置"adjust..."的属性,对于没有滚动控件的布局来说,采用的是adjustPan方式,而对于有滚动控件的布局,则是采用的adjustResize方式。
 
(个人理解就是Resize是调整窗口大小,只能对可滑的调整,Pan是向上滑动布局,只能对不可滑的调整)
了解了上面的这些知识之后,我们就可以根据自己的需求设置不同的方式了。而且,关于如何使得界面加载的时候不显示软键盘,我们也有了一个很清楚的认识。
注:
1、设置了View的setFitsSystemWindows对上面的设置有影响
1、常用设置
android:windowSoftInputMode="adjustUnspecified|stateHidden"
 
  • 大小: 60.1 KB
  • 大小: 69.1 KB
  • 大小: 74.3 KB
分享到:
评论

相关推荐

    Android中的windowSoftInputMode属性详解

    在前面的一篇文章中,简单的介绍了一下如何实现软键盘不自动弹出,使用的方法是设置android:windowSoftInputMode属性。那么,这个属性到底是干什么的,他有什么作用呢?今天这篇文章,就是探索android:...

    Android实现键盘弹出界面上移的实现思路

    基本就是结合layout中ScrollView视图和AndroidManifest.xml中activity中的android:windowSoftInputMode属性配置实现; 2.要了解android:windowSoftInputMode相应的可以配置项: activity主窗口与软键盘的交互模式,...

    Android代码-仿微信app.rar

    &lt;!... android:name="com.fanxin.huangfangyi.main.activity.LoginActivity" android:screenOrientation="portrait" android:theme="@style/horizontal_... android:windowSoftInputMode="adjustPan"&gt;&lt;/activity&gt;

    android edittext不弹出软键盘三种方法

    在AndroidMainfest.xml中选择哪个activity,设置windowSoftInputMode属性为adjustUnspecified|stateHidden 例如: &lt;activity android:name=".Main" android:label="@string/app_name" android:...

    页面未随软键盘上升及android隐藏软键盘总结

    就是在配置文件里对应activity加上这句:android:windowSoftInputMode=”stateVisible|adjustResize”  设置之后 android:windowSoftInputMode属性介绍 android:windowSoftInputMode activity主窗口与软键盘的...

    MyFileChooser.rar

    &lt;item name="android:windowSoftInputMode"&gt;adjustNothing  &lt;item name="android:windowNoTitle"&gt;true&lt;/item&gt; &lt;/style&gt; ----------- android:name="studio32a.yangguang.passwordmanager....

    安卓开发过程中总结的一些案例

    # ShopCart 案例 ## 截图 ![购物车](screenshots/shopcart.png) ## 功能与特性 ... * recycleview 中嵌套 Checkbox 的选择问题,一般在 bean 类添加...activity 添加 android:windowSoftInputMode="stateHidden|adjust

    仿qq登录界面软键盘弹出时不覆盖登录注册按钮

    1、将activity的软件盘弹出模式设置为android:windowSoftInputMode="adjustResize" 2、使用一个可以重叠的布局比如FrameLayout、RelativeLayout等,在布局底部放置一个充满屏幕的自定义布局,重写onSizeChanged方法...

    让Android中RadioGroup不显示在输入法上面的办法

    如果你在开发过程中经常使用 RadioGroup,那你是否遇到过下面这种情况 ... 你可能会想到需要给RadioGroup添加下面这条属性: android:layout_alignParentBottom...android:windowSoftInputMode=adjustNothing 写法如下:

    Android代码-KeyboardChangeListener

    android:windowSoftInputMode="adjustResize" java: new KeyboardChangeListener(this).setKeyBoardListener(new KeyboardChangeListener.KeyBoardListener() { @Override public void onKeyboardChange(boolean ...

    Android :使用ViewTreeObserver进行监听测绘页面

    “android:windowSoftInputMode=adjustPan|stateHidden ,但是没啥用啊,后来又详细的查看了相对应的其他几个参数,也都挨个试验了,最后失败;只好再次去另寻他法 2.第二个方法就是进行让整个页面进行滑动,NestedScroll

    Android输入法弹出时覆盖输入框问题的解决方法

    当一个activity中含有输入框时,我们点击输入框,会弹出输入法界面,整个界面的变化效果与manifest中对应设置的android:windowSoftInputMode属性有关,一般可以设置的值如下, &lt;activity android:...

    Android仿微信QQ聊天顶起输入法不顶起标题栏的问题

    在这记录一下输入法弹出的一系列问题,有的输入法弹出就把...android:windowSoftInputMode=adjustResize 二:在activity的xml根布局设置 android:fitsSystemWindows=true 三:为了listview聊天列表的效果,在listview

    Android键盘挡住输入框

    * 本来以为Actviity设置下android:windowSoftInputMode="adjustResize|adjustPan"就可以解决问题,测试下了发现不行; * adjustPan是把整个界面向上平移,使输入框露出,不会改变界面的布局; 不行吧,我这边已经全部...

    Android中Activity启动默认不显示输入法解决方法

    您可能感兴趣的文章:Android中系统默认输入法设置的方法(输入法的显示和隐藏)Android 显示和隐藏输入法实现代码Android程序打开和对输入法的操作(打开/关闭)Android实现输入法弹出时把布局顶上去和登录按钮顶上去

    Android 软键盘弹出隐藏挤压界面等各种问题小结

    Android中软键盘的使用是非常多的,下面为软键盘常用的设置;...android:windowSoftInputMode=adjustResize 这样activity的主窗口总会resize为键盘提供空间 case2:你的输入框处于偏上面,一般情况下这样就不会有

    Android软键盘挡住输入框的终极解决方案

    对于这种情况的处理其实很简单,只需要在AndroidManifest文件中对activity设置:android:windowSoftInputMode的值adjustPan或者adjustResize即可,像这样: &lt;activity android:name=.MainActivity

    Android软键盘显示模式及打开和关闭方式(推荐)

    如:android:windowSoftInputMode=”stateUnchanged|adjustPan”  该属性可选的值有两部分,一部分为软键盘的状态控制,另一部分是活动主窗口的调整。前一部分本文不做讨论,请读者自行查阅android文档。  模式一...

Global site tag (gtag.js) - Google Analytics