[转]软键盘用法总结

软键盘用法

Android开发中,软键盘是一个比较常用的了。总结下来,再也不用去网上搜资料了。

1、软键盘原理

在android中,软键盘原理上是一个dialog,InputMethodService为我们的输入法创建了一个Dialog,并且对某些参数进行了设置,使之能够在底部或者全屏显示。当我们点击输入框时,系统会对当前的主窗口进行调整,以便留出相应的空间来显示该Dialog在底部,或者全屏。

2、如何显示和隐藏软键盘

2.1显示软键盘

方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示)

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

方法二(view为接受软键盘输入的视图,SHOW_FORCED表示强制显示)

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view,InputMethodManager.SHOW_FORCED);

2.2隐藏软键盘

imm.hideSoftInputFromWindow(view.getWindowToken(), 0); //强制隐藏键盘

2.3默认不弹出软键盘最简单的方法

在Activity的清单文件中,添加属性 
Android:windowSoftInputMode=”stateHidden”如下:

   <activity
       android:name=".PulishSellInfoActivity"
       android:windowSoftInputMode="stateHidden" >
   </activity>

3、输入框被软键盘盖住如何解决

方法一

在你的activity中的oncreate中setContentView之前写上这个代码getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

方法二

在项目的AndroidManifest.xml文件中界面对应的<activity>里加入android:windowSoftInputMode="stateVisible|adjustResize",这样会让屏幕整体上移。
如果加上的是 android:windowSoftInputMode="adjustPan"这样键盘就会覆盖屏幕。

方法三

把顶级的layout替换成ScrollView,或者说在顶级的Layout上面再加一层ScrollView的封装。这样就会把软键盘和输入框一起滚动了,软键盘会一直处于底部。

4、windowSoftInputMode属性讲解(下面这段内容我参考别人的博客,并加入我的一些意见)

我们从这个属性的名称中,可以很直观的看出它的作用,这个属性就是来设置窗口软键盘的交互模式的。android:windowSoftInputMode属性一共有9个取值,分别是:

【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

我们可以在这9个值里面选择一个,也可以用”state…|adjust”的形式进行设置。那么,下面我们就介绍这9个值到底是如何影响软键盘的显示的。

1.stateUnspecified

中文意思是未指定状态。当我们没有设置android:windowSoftInputMode属性的时候,软件默认采用的就是这种交互方式,系统会根据界面采取相应的软键盘的显示模式,并且在不同的手机上,显示是不同的。比如,当界面上只有文本和按钮的时候,软键盘就不会自动弹出,因为没有输入的必要。那么,当界面上出现了获取了焦点的输入框的时候,软键盘会不会自动的弹出呢?这个还真不一定!比如,在下面的这个界面布局中,有的手机软键盘并不会自动弹出,但有的手机会弹出来的。

就是说,默认的,在这种界面情况下,系统并不确定用户是否需要软键盘,因此不一定自动弹出。但是,为什么说不一定呢?这是因为,如果我们在这个布局的外面,包裹上一个ScrollView,软键盘就会自动的弹出来了! 
如下,在这种布局文件下,软键盘会自动的弹出

2.stateUnchanged

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

3.stateHidden

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

当我初次打开这个页面的时候,看到没,这个输入框是有焦点的,但是没有弹出软键盘,但是当你再次点击输入框的时候会再次弹出软键盘,下面就是默认不弹出软键盘简单方法。

    <activity
       android:name=".PulishSellInfoActivity"
       android:windowSoftInputMode="stateHidden" >
    </activity>

4.stateAlwaysHidden

用户选择activity时,软键盘总是被隐藏,我并不知道和stateHidden的区别

5.stateVisible

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

6.stateAlwaysVisible

这个属性也是可以将键盘召唤出来,但是与stateVisible属性有小小的不同之处。举个例子,当我们设置为stateVisible属性,如果当前的界面键盘是显示的,当我们点击按钮跳转到下个界面的时候,软键盘会因为输入框失去焦点而隐藏起来,当我们再次回到当前界面的时候,键盘这个时候是隐藏的。但是如果我们设置为stateAlwaysVisible,我们跳转到下个界面,软键盘还是隐藏的,但是当我们再次回来的时候,软键盘是会显示出来的。所以,这个Always就解释了这个区别,不管什么情况到达当前界面(正常跳转或者是上一个界面被用户返回),软键盘都是显示状态。 
说到这里,我联想到了上面的stateHidden和stateAlwaysHidden,我估计区别也是这样的,就是说,stateAlwaysHidden无论如何都是隐藏的,但是如果在跳转到下个界面的时候,软键盘被召唤出来了,那么当下个界面被用户返回的时候,键盘应该是不会被隐藏的,但是,我还没有找到能够跳转到下个界面,还让当前界面软键盘不消失的方法,所以暂时不能验证。

7.adjustUnspecified

默认设置,通常由系统自行决定是隐藏还是显示,这个属性,我在手机上捣鼓了半天,没明白它是做什么用的,用了解的小伙伴可以告诉我。谢谢。

8.adjustResize

这个属性表示Activity的主窗口总是会被调整大小,从而保证软键盘显示空间。请大家看图,对于没有Scrollview的布局,默认属性时,整个布局是被顶上去了,但是设置为adjustResize属性,布局的位置并没有发生什么变化,而是被覆盖,我试过不管有没有ScrolView都是这样,这就是最大的区别。

当点击“请输入文字4”所在的输入框,效果图是这样的:

看到没,“请输入文字4”所在的输入框被覆盖了。

总结一下:当设置成adjustResize后,软键盘会覆盖界面,甚至会覆盖文本框,而不会调整界面大小去显示输入框,而且不管有没有ScrolView都是一样的。

9.adjustPan

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

首先,这是软键盘没有弹出的时候,有Scroll的显示范围。

当我们点击“请输入文字4”所在的输入框,我们会发现下面的现象。 最上面标题栏已经不能看到了。 而且还不能滑动,上下都不能滑动。是不是很奇怪。

总结

通过以上的实验,我们可以得出结论,如果我们不设置”adjust…”的属性,对于没有滚动控件的布局来说,采用的是adjustPan方式,而对于有滚动控件的布局,则是采用的adjustResize方式。了解了上面的这些知识之后,我们就可以根据自己的需求设置不同的方式了。而且,关于如何使得界面加载的时候不显示软键盘,我们也有了一个很清楚的认识。

来源:软键盘用法总结

时间: 2024-10-10 12:04:40

[转]软键盘用法总结的相关文章

Android软键盘用法实例

package com.example.key; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.view.View

Android项目:输入法软键盘显示/隐藏的监听和控制,InputMethodManager用法研究

在项目开发中,用到编辑框的地方经常涉及到要监听或者控制软键盘的显示/隐藏状态.本以为这是很容易解决的一个小问题,没想到当初碰到这个问题才明白还得花点小心思才能整好.现将针对软键盘的显示/隐藏状态的监听/监控方法做一些总结,以备后用. 一.点击空白处隐藏软键盘 这是具有编辑框焦点的页面对输入法软键盘状态监听的一般需求和解决方法. 首先获得InputMethodManager:        InputMethodManager manager = (InputMethodManager) getS

android的alertdialog中加入edittext但是不弹出软键盘等问题的解决与原因

摘要:alertdialog中加入edittext但是不弹出软键盘等问题网上有很多不管用的解决方案, 本文意在给出更有效的解决办法,并初步探究其原因 正文 在对话框中插入文本框是十分常见的需求 通常我们选择在代码中创建edittext对象 这个时候就需要在代码中给edittext设置输入属性了 但是经常发现设置的属性不起作用,甚至都不弹出软键盘(虽然实体键盘可以输入) 问题的解决方案有很多种,这里介绍一种我比较常用的方法: inputPassEditText.setInputType(Input

彻底搞定Android开发中软键盘的常见问题

软键盘显示的原理 软件盘的本质是什么?软键盘其实是一个Dialog. InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示.当我们点击输入框时,系统对活动主窗口进行调整,从而为输入法腾出相应的空间,然后将该Dialog显示在底部,或者全屏显示. 软键盘显示的调整 Android定义了一个属性,名字为windowSoftInputMode, 这个属性用于设置Activity主

ionic3 监听软键盘的高度

ionic1 和普通cordova的大家都知道 就是看ionic3 和4 https://blog.csdn.net/sean_css/article/details/70243893 ionic cordova plugin add ionic-plugin-keyboard $ npm install --save @ionic-native/keyboard 经过本人测试 这个方法 ionic1 ionic3 都可以用 ionic3 把方法写到 构造器 或者 生命周期事件里面就行 ioni

前端angularJS利用directive实现移动端自定义软键盘的方法

最近公司项目的需求上要求我们iPad项目上一些需要输入数字的地方用我们自定义的软键盘而不是移动端设备自带的键盘,刚接到需求有点懵,因为之前没有做过,后来理了一下思路发现这东西也就那样.先看一下实现之后的效果: 实现的效果就是当点击页面中需要弹出软键盘的时候软键盘弹出,浮在页面的中间,和模态框一样的效果,可以在软键盘中输入任何数字,附带的功能有小数点.退格.清空.确定等功能.当在键盘上点击数字的时候页面中的表单中实时的添加对应的数字,上图中可以看到. 产品经理那边给的原因是iPad屏幕本来就小,如

android自动弹出软键盘(输入键盘)

searchEditView.setFocusable(true); searchEditView.setFocusableInTouchMode(true); searchEditView.requestFocus(); Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { InputMethodManager inputManager = (InputMethodManager) sea

第一个app-进阶:1、让EditText屏蔽软键盘仍能光标闪动:2、EditText 的inputType参数类型(密码方式-隐藏显示、只允许输入数字等等)

EditText屏蔽软键盘后,光标消失问题 开始我有个需求:屏蔽系统软键盘 于是找到并使用这个方法: //edit_text1.setInputType(InputType.TYPE_NULL); //屏蔽软键盘弹出//edit_text2.setInputType(InputType.TYPE_NULL); //屏蔽软键盘弹出//edit_text3.setInputType(InputType.TYPE_NULL); //屏蔽软键盘弹出 让三个EditText都成功地没有软键盘弹出. 后来我

Android 设置系统的返回键 和软键盘获取焦点问题

很多朋友出现过这样的一个问题,当底部弹出评论框时,有几个问题,一个是软件盘弹出时怎么让焦点在输入框,关于这个问题,本人也是遇到过,解决了很久,有的是在布局设置或者代码里setFocusable(true),并没有用,又在代码或者代码里设置requestFocus(),依然没有用,其实这个解决办法是没有错的,但是为什么会没用呢,因为并没有及时是在软件盘弹出时设置,所以先提出隐藏和显示软件盘的方法 private void onFocusChange(boolean hasFocus) { fina