android 键盘遮盖输入框_Android各种键盘挡住输入框解决办法

原标题:Android各种键盘挡住输入框解决办法

今日科技快讯

C919大型客机首飞成功,让很多人激动不已。然而近日网上也出现了一些不同的声音:说这架飞机许多部件都是进口货,甚至有人说C919中国人只是造了个壳子。对此,业内人士回应称:即使是波音空客,也不可能生产所有零件。全球采购,是航空制造业的通用做法;把所有部件整合在一起,才是最关键的核心技术。

作者简介

大家早上好,新的一周又开始啦!

本篇来自 潇潇凤儿的投稿,对于键盘挡住输入框,给出了多种方案,希望对大家有所帮助。

潇潇凤儿的博客地址:

http://blog.csdn.net/smileiam

正文

在开发中,经常会遇到键盘挡住输入框的情况,比如登录界面或注册界面,弹出的软键盘把登录或注册按钮挡住了,用户必须把软键盘收起,才能点击相应按钮,这样的用户体验非常不好。像微信则直接把登录按钮做在输入框的上面,但有很多情况下,这经常满足不了需求。同时如果输入框特别多的情况下,点击输入时,当前输入框没被挡住,但是当前输入框下面的输入框却无法获取焦点,必须先把键盘收起,再去获取下面输入框焦点,这样用户体验也非常不好,那有什么办法呢/p>

系统的 adjustResize 和 adjustPan 有什么区别,他们使用时的注意事项,有什么系统要求及蔽端呢/p>

下面对几种在开发中常用的方法进行总结:

方法一:windowSoftInputMode:adjustResize和adjustPan

主要实现方法:在 AndroidManifest.xml 对应的Activity里添加 android_windowSoftInputMode=”adjustPan” 或是 android_windowSoftInputMode=”adjustResize”属性

这两种属性的区别,官方的解释是:

android 键盘遮盖输入框_Android各种键盘挡住输入框解决办法

adjustResize失效情况:activity 设置了全屏属性指 Theme.Light.NotittleBar.Fullscreen 或者设置了 activity 对应的主题中 android:windowTranslucentStatus 属性,设置方式为:android:windowTranslucentStatus=true,这时如果对应的页面上含有输入框,将会导致点击输入框时软键盘弹出后键盘覆盖输入框,导致输入框看不见。

fitsSystemWindows=”true”,只有初始的view起作用:如果在布局中不是最外层控件设置 fitsSystemWindows=”true”, 那么设置的那个控件高度会多出一个状态栏高度。若有多个view设置了,因第一个view已经消耗掉 insect,其他 view 设置了也会被系统忽略。

假设原始界面是一个 LinearLayout 包含若干 EditText,如下图所示,在分别使用两种属性时的表现:

android 键盘遮盖输入框_Android各种键盘挡住输入框解决办法

2djustResize

需要界面的高度是可变的,或者说 Activity 主窗口的尺寸是可以调整的,如果不能调整,则不会起作用。

例如:Activity 的xml布局中只有一个 LinearLayout 包含若干EditText,在Activity的 AndroidMainfest.xml 中设置 android_windowSoftInputMode=”adjustResize” 属性,点击 输入框6, 发现软键盘挡住了 输入框6,并没有调整,如下图所示:

android 键盘遮盖输入框_Android各种键盘挡住输入框解决办法

通过该工具,我们看到:

界面真正能用的高度=屏幕高度-状态栏高度-软键盘高度

界面中蓝框是真正界面所用的高度:

android 键盘遮盖输入框_Android各种键盘挡住输入框解决办法

我们借助 Inspect Layout 工具查看此设置布局可用高度,从下图可以看出,此时布局可用高度是屏幕的高度,上下滑动也只是此屏的高度,在 输入框9 以下的输入框滑不出来,向上滑动,也只能滑到 输入框1。

android 键盘遮盖输入框_Android各种键盘挡住输入框解决办法

我们再来看看 windowSoftInputMode 默认属性值 stateUnspecified:

android 键盘遮盖输入框_Android各种键盘挡住输入框解决办法

先获取到最外层控件:

RelativeLayoutmain =(RelativeLayout) findViewById(R.id.main);

(2).获取到最后一个控件,如上面的xml文件,最后一个控件是Button:

Buttonlogin_btn =(Button) findViewById(R.id.login_btn);

(3).给最外层控件和最后一个控件添加监听事件:

android 键盘遮盖输入框_Android各种键盘挡住输入框解决办法

它的实现原理主要是:

(1).找到 Activity 的最外层布局控件,我们知道所有的 Activity 都是 DecorView,它就是一个 FrameLayout控件,该控件id是系统写死叫 R.id.content,就是我们 setContentView 时,把相应的 View 放在此 FrameLayout 控件里

FrameLayoutcontent =(FrameLayout) activity.findViewById(android.R.id.content);

所以 content.getChildAt(0) 获取到的 mChildOfContent,也就是我们用 setContentView 放进去的 View。

(2).给我们的 Activity 的xml布局View设置一个 Listener 监听:

android 键盘遮盖输入框_Android各种键盘挡住输入框解决办法

如下图所示:

android 键盘遮盖输入框_Android各种键盘挡住输入框解决办法

(4).重设高度, 我们计算出的可用高度,是目前在视觉效果上能看到的界面高度。但当前界面的实际高度是比可用高度要多出一个软键盘的距离的。

通过上面的这种方法,一般布局输入键盘挡住输入框的问题基本都能解决。即使界面全屏或是沉浸式状态栏情况。

总结

下面对上面几种方法进行对比:

方法一:

优点:使用简单,只需在Activity的AndroidMainfest.xml中设置windowSoftInput属性即可。

注意点:adjustResize属性必须要界面大小可以自身改变;

缺点:当输入框比较多时,当前输入框下方的输入框会初键盘挡住,须收起键盘再进入输入;使用adjustPan,输入框较多时,因它是把界面当成一个整体,只会显示一屏的高度,会把ActionBar顶上去。

方法二:

优点:使用简单,只需在Activity的最外层布局包裹一个ScrollView即可。

注意点:不可使用adjustPan属性,否则ScrollView失效;

缺点:对于全屏时,在键盘显示时,无法上下滑动界面达到输入的目的;

方法三:

优点:可以解决全屏时,键盘挡入按钮问题。

缺点:只要有此需求的Activity均需要获取到最外层控件和最后一个控件,监测键盘是否弹出,再调用控件的scrollTo方法对界面整体上移或是下移。代码冗余。

方法四:

优点:可以解决全屏时,键盘挡入输入框问题。只需要写一个全局类,其他有需求的界面直接在onCreate方法里调用此类的全局方法,即可。

缺点:多用了一个类。

综上所述:

1) 当输入框比较少时,界面只有一个输入框时,可以通过方法一设置adjustPan;

2) 如果对于非全屏/非沉浸式状态栏需求,只需要使用方法二即可;

3) 如果全屏全屏/沉浸式状态栏界面只有一个类有键盘挡入输入框需求,可使用方法三;

4) 如果大部分界面均使用全屏或沉浸式状态栏,且有此需求,则选择方法四更恰当。

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。返回搜狐,查看更多

责任编辑:

相关资源:Veneer:文件屏蔽软件-开源-其它代码类资源-CSDN文库

来源:weixin_39633917

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年11月16日
下一篇 2020年11月16日

相关推荐