在开发登录界面时,在点击某个EditText准备输入时,弹出的软键盘遮挡了按钮或者下面的输入框,在完成这个文本框的输入后,想要继续下面的操作,需要先隐藏软键盘。这会影响用户操作的流畅感,所以需要解决。在尝试了网上的几种处理方法后,最终选择了一种比较满意的方式。

下面先给一个图,来讲解下问题所在:

这个图中有四个场景:
第一个场景,是没有弹出软键盘的登录界面,可以看出所有view都正常展示出来了;
第二个场景,弹出了软键盘,此时,下面的密码输入框、登录按钮都被遮挡了;
第三个场景,弹出了软键盘,输入了一个字母,此时,软键盘又增长了一部分,但是用户名输入框也上移了,并没有被遮盖。不同的手机的软键盘不同,我是在华为手机上遇到这种情况,在解决遮挡问题时也要考虑这个场景;
第四个场景,是我们的目标,弹出了软键盘,原来的视图整体上移了,显示出来我们要操作的view。

下面说下解决软键盘遮盖问题的过程:

首先,是希望Android系统有自带的属性,一设置就搞定问题的。

搜索了下,都是说使用WindowSoftInputMode属性,设置为”adjustPan|stateHidden”或者”adjustResize|stateHidden”,经过测试,这种设置对我的布局没有效果,基本与不设置的默认效果相同。软键盘正好在编辑的EditText的下面,会遮挡登录按钮。

第二种方法,是使用ScrollView:

在整体布局的外面加一个ScrollView,在文本框的onTouch监听动作中,滚动整个视图。
实测问题:
1,监听到onTouch动作后,进行滚动整个视图操作,需要延时才有效。
原因:onTouch时,软键盘还没有弹出,此时滚动到底部与不滚动是一样的效果。需要等软键盘弹出后,界面中的内容超过了一屏幕,此时的滚动才有效。
2,这个延时时间是多少?
不同手机的延时时间不一致,好的手机100ms就可以了,慢的手机延时500ms也不一定每次都有效果。
3,延时带来的问题:
若延时超过300ms,人眼就能感觉出来了:先是软键盘弹出,然后才是视图滚动。用户会感觉有些奇怪:为什么要动作两次呢?
这种方案,可以凑合使用了,可是,我们要做优雅的开发者,继续寻找!

第三种方法:监听布局变化;

既然使用延时不是一个优雅的方案,那么,滚动视图的最好的时间,当然是在布局变化的时刻。
这里,可以使用OnGlobalLayoutListener来实现。我们来学习下:
OnGlobalLayoutListener 是ViewTreeObserver的内部类,当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知。
总结为简单一句话:使用OnGlobalLayoutListener可以监听到布局的变化。
监听到布局变化后,我们就可以自由的操作了:
可以外包一个ScrollView来进行滚动,使用一个

scrollView.fullScroll(ScrollView.FOCUS_DOWN)

来滚动到底部。
不过,不使用ScrollView也能进行滚动的,例如LinearLayout也是可以滚动的,你还不知道吧,其实,我也是才知道:最基础的View就有个ScrollTo()函数的。
好了,基础知识准备好了,剩下就是滚动的距离计算了,我们这样来计算:
通过窗体的根View求出总的区域和可视区域,这样就可以计算出被遮挡的区域的高度,如果超过一定的值就判断为软键盘弹出了,然后将根View ScrollTo到一个位置,将被遮挡的View展示出来。
这里还有个要注意的地方,就是ScrollTo的参数,先看看函数原型:

public void scrollTo(int x, int y)

两个参数x、y,是要滚动到位置的坐标,注意,它们是绝对坐标。
而我们计算滚动距离的时候,是计算的相对滚动距离。还记得上面的场景2与场景3么,点击输入框,滚动视图,进入场景2,然后点击一个字母,进入场景3,此时,就是一个比较小的相对滚动距离。后面,我们在代码中也有相应注释,要注意理解下哦。

下面是贴代码的时间了,先展示我的布局xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/ll_loginView"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#FAFAFA"android:orientation="vertical" ><ImageView
        android:layout_width="fill_parent"android:layout_height="350dp"android:background="#8fE095"android:scaleType="centerInside"android:src="@drawable/logo" /><View
        android:layout_width="match_parent"android:layout_height="5dp"android:focusable="true"android:focusableInTouchMode="true" /><LinearLayout
        android:layout_width="fill_parent"android:layout_height="300dp"android:orientation="vertical" ><EditText
            android:id="@+id/userName"android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="center_vertical"android:hint="请输入用户名"android:inputType="text"android:maxLength="18"android:paddingBottom="10dip"android:singleLine="true"android:textColor="#808080"android:text=""android:textSize="18sp" /><EditText
            android:id="@+id/userPwd"android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="center_vertical"android:hint="请输入密码"android:inputType="numberPassword"android:maxLength="20"android:paddingBottom="10dip"android:singleLine="true"android:textColor="#808080"android:text=""android:textSize="18sp" ></EditText><LinearLayout
            android:id="@+id/layout03"android:layout_width="fill_parent"   android:layout_height="wrap_content"android:layout_marginTop="10dp" android:orientation="horizontal"><CheckBox
                android:id="@+id/login_check"android:layout_width="wrap_content"android:layout_height="wrap_content" android:checked="true"/><TextView
                android:id="@+id/rememberPwd"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="记住用户名"android:textColor="#808080"android:textSize="15sp" /></LinearLayout><Button
            android:id="@+id/btn_login"android:layout_width="300dp"android:layout_height="50dp"android:layout_gravity="center_horizontal"android:layout_marginTop="40dp"android:background="@drawable/login_buton"android:gravity="center"android:text="立 即 登 录"android:textColor="@android:color/background_light" /></LinearLayout></LinearLayout>

然后是主Activity:

package com.example.loginTest;import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.widget.Button;
import android.widget.LinearLayout;
import com.example.loginTest.R;public class MainActivity extends Activity {private Button btn_login;private LinearLayout ll_loginView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);btn_login = (Button) findViewById(R.id.btn_login);ll_loginView = (LinearLayout) findViewById(R.id.ll_loginView );autoScrollView(ll_loginView, btn_login);//弹出软键盘时滚动视图        }   /*** @param root 最外层的View* @param scrollToView 不想被遮挡的View,会移动到这个Veiw的可见位置*/private int scrollToPosition=0;private void autoScrollView(final View root, final View scrollToView) {root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {Rect rect = new Rect();//获取root在窗体的可视区域root.getWindowVisibleDisplayFrame(rect);//获取root在窗体的不可视区域高度(被遮挡的高度)int rootInvisibleHeight = root.getRootView().getHeight() - rect.bottom;//若不可视区域高度大于150,则键盘显示if (rootInvisibleHeight > 150) {//获取scrollToView在窗体的坐标,location[0]为x坐标,location[1]为y坐标int[] location = new int[2];                   scrollToView.getLocationInWindow(location);//计算root滚动高度,使scrollToView在可见区域的底部int scrollHeight = (location[1] + scrollToView.getHeight()) - rect.bottom;//注意,scrollHeight是一个相对移动距离,而scrollToPosition是一个绝对移动距离scrollToPosition += scrollHeight;} else {//键盘隐藏scrollToPosition = 0;                   }root.scrollTo(0, scrollToPosition);}});}    }

demo代码下载地址:

http://download.csdn.net/detail/lintax/9694929
PS:虽然使用上了Android Studio,但是家里电脑确实太慢了,所以demo还是一个Eclipse工程。

参考:

http://blog.csdn.net/yqichang/article/details/11705235

Android软键盘遮挡问题解决相关推荐

  1. android自定义键盘遮挡,Android软键盘遮挡的四种完美解决方案

    一.问题概述 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示: 输入密码时 ...

  2. Android软键盘遮挡的四种解决方案

    Android软键盘遮挡的四种解决方案 参考文章: (1)Android软键盘遮挡的四种解决方案 (2)https://www.cnblogs.com/jerehedu/p/4194125.html ...

  3. Android软键盘遮挡EditText问题

    最近在调试App过程遇到软件盘遮挡EditText的问题,特记录下问题的解决过程 在4.4版本上,如果EditText设置了gravity="center|right"其中之一且同 ...

  4. android 键盘遮挡,Android软键盘遮挡的四种解决方案

    在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示: 输入密码时输入框被系统键 ...

  5. android 软键盘遮挡登陆按钮的问题,Android优雅的方式解决软键盘遮挡按钮问题

    前言 比如在进行登录的操作中,用户输入完密码之后,肯定是想直接点击登录按钮的.返回键隐藏软键盘这样的体验肯定很糟糕,程序员,遇到问题解决问题. 实现1 xml android:id="@+i ...

  6. rn android软键盘遮挡布局处理,完美解决RN 键盘遮挡问题

    当输入框在底部的时候, 唤起键盘会造成遮挡问题,解决方法如下: class ForumDetail extends React.Component { render(){ let behavior = ...

  7. Android 软键盘弹出时布局内指定内容上移实现及问题解决

    Android 软键盘弹出时布局内指定内容上移实现及问题解决 参考文章: (1)Android 软键盘弹出时布局内指定内容上移实现及问题解决 (2)https://www.cnblogs.com/as ...

  8. android EditText光标位置,光标样式,EditText限制输入内容,软键盘遮挡的EditText,搜索框,限制输入表情

    显示在软键盘上 android:windowSoftInputMode="adjustPan|stateHidden" 1.光标位置 homesosoedit.setSelecti ...

  9. android 软键盘遮住按钮,Android应用中出现软键盘遮挡住按钮如何解决

    Android应用中出现软键盘遮挡住按钮如何解决 发布时间:2020-11-20 16:25:47 来源:亿速云 阅读:110 作者:Leah Android应用中出现软键盘遮挡住按钮如何解决?相信很 ...

  10. android虚拟键盘挡住布局,让Android软键盘不遮挡布局

    在Android UI中,我们常常会使用EditText,比如在一个ScrollView中放置多个EditText,如下图: 带有edittext的scrollview.png 当用户点击这个Edit ...

最新文章

  1. (十二)java版b2b2c社交电商spring cloud分布式微服务:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪...
  2. Nutch开发(三)
  3. 通俗易懂,嵌入式Linux驱动基础
  4. 【转载】别了,摩托罗拉(十六):平台之乱
  5. 嵌入式linux系统移植的四大步骤_嵌入式系统移植步骤
  6. Hadoop tutorial - 3 Hello MapReduce- 2015-3-30
  7. 【操作系统/OS笔记17】文件系统基本概念、文件描述符、文件系统访问、文件别名、文件系统种类
  8. python的枚举函数_enumerate()函数~~返回一个枚举对象
  9. Python人脸识别项目-基础代码
  10. python实现自动化不停打电话
  11. 如何在Linux上编写和运行程序?
  12. 时域离散随机信号的统计特性
  13. 机器学习周志华第一章
  14. 面试必问——你有什么问题问我吗
  15. 医学超声成像—合成孔径法(Synthetic Aperture Methods)[3]
  16. [To Selina] 《撒野》读后感
  17. 什么是WiFi无缝漫游(即无线AP自动切换)?
  18. 明源地产ERP实施五步法
  19. RAS--远程访问服务
  20. Maven Framwork – Install and Config

热门文章

  1. Python数据分析与可视化案例解析
  2. 昨天面了一位,见识到了Spring的天花板~
  3. 幸福课第11讲_笔记
  4. JavaScript快速入门通俗易懂
  5. Python一路走来 DAY15 Javascript
  6. pure-ftpd安装与使用
  7. 沙巴克皇宫门修复后需要重启服务器,关于传奇3.0的沙巴克设置问题解决
  8. 计算机网络网络适配器的作用是什么原因,Win10网络适配器在哪里对网络有什么影响 网络适配器出现各种故障的解决方法...
  9. 【为人处事】:如何识人
  10. java多属性的map_java集合(四)Map集合之Properties详解