在Android UI中,我们常常会使用EditText,比如在一个ScrollView中放置多个EditText,如下图:

带有edittext的scrollview.png

当用户点击这个EditText时会触发软键盘,这个软键盘会把EditText以下的界面挡住:

被edittext遮挡的scrollview.png

android:windowSoftInputMode

Activity 的主窗口与包含屏幕软键盘的窗口的交互方式。 该属性的设置影响两个方面:

当 Activity 成为用户注意的焦点时软键盘的状态 — 隐藏还是可见。

对 Activity 主窗口所做的调整 — 是否将其尺寸调小来为软键盘腾出空间,或者当窗口部分被软键盘遮挡时是否平移其内容以使当前焦点可见。

注意:该设置必须是下表所列的值之一,或者是一个“state...”值加上一个“adjust...”值的组合。在任一组中设置多个值(例如,多个“state...”值)都会产生未定义结果。各值之间使用垂直条 (|) 分隔。例如:

说明

"stateUnspecified"

不指定软键盘的状态(隐藏还是可见)。 将由系统选择合适的状态,或依赖主题中的设置。这是对软键盘行为的默认设置。

“stateUnchanged”

当 Activity 转至前台时保留软键盘最后所处的任何状态,无论是可见还是隐藏。

“stateHidden”

当用户选择 Activity 时 — 也就是说,当用户确实是向前导航到 Activity,而不是因离开另一 Activity 而返回时 — 隐藏软键盘。

“stateAlwaysHidden”

当 Activity 的主窗口有输入焦点时始终隐藏软键盘。

“stateVisible”

在正常的适宜情况下(当用户向前导航到 Activity 的主窗口时)显示软键盘。

“stateAlwaysVisible”

当用户选择 Activity 时 — 也就是说,当用户确实是向前导航到 Activity,而不是因离开另一 Activity 而返回时 — 显示软键盘。

“adjustUnspecified”

不指定 Activity 的主窗口是否调整尺寸以为软键盘腾出空间,或者窗口内容是否进行平移以在屏幕上显露当前焦点。 系统会根据窗口的内容是否存在任何可滚动其内容的布局视图来自动选择其中一种模式。 如果存在这样的视图,窗口将进行尺寸调整,前提是可通过滚动在较小区域内看到窗口的所有内容。这是对主窗口行为的默认设置。

“adjustResize”

始终调整 Activity 主窗口的尺寸来为屏幕上的软键盘腾出空间。

“adjustPan”

不调整 Activity 主窗口的尺寸来为软键盘腾出空间, 而是自动平移窗口的内容,使当前焦点永远不被键盘遮盖,让用户始终都能看到其输入的内容。 这通常不如尺寸调正可取,因为用户可能需要关闭软键盘以到达被遮盖的窗口部分或与这些部分进行交互。

从上表可以知道Activity的windowSoftInputMode默认是stateUnspecified|adjustUnspecified。这样我们就可以理解在scrollview中edittext会通过滚动在较小区域内看到窗口的所有内容,即表现为和adjustResize一样。

解决方案

修改受影响的activity的windowSoftInputMode属性

android:name=".mall.TeaDetailsActivity"

android:screenOrientation="portrait"

android:windowSoftInputMode="stateHidden|adjustResize" />

然后设置EditText的点击事件

et.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

getKeyboardHeight();

}

});

判断软键盘是否弹出

private void getKeyboardHeight() {

//注册布局变化监听

getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

//判断窗口可见区域大小

Rect r = new Rect();

getWindow().getDecorView().getWindowVisibleDisplayFrame(r);

//如果屏幕高度和Window可见区域高度差值大于整个屏幕高度的1/3,则表示软键盘显示中,否则软键盘为隐藏状态。

int heightDifference = screenHeight - (r.bottom - r.top);

boolean isKeyboardShowing = heightDifference > screenHeight / 3;

if (isKeyboardShowing) {

changeScrollView();

//移除布局变化监听

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {

getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(this);

} else {

getWindow().getDecorView().getViewTreeObserver().removeGlobalOnLayoutListener(this);

}

}

}

});

}

使ScrollView滚动到底部

private void changeScrollView() {

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

//将ScrollView滚动到底

mScrollView.fullScroll(View.FOCUS_DOWN);

}

}, 100);

}

这样,我们的软键盘就会显示成如下图:

软键盘显示在布局之下.png

然而,这样还有个问题,就是第一个输入框被遮挡住了,我们可以考虑使用scrollTo方法让ScrollView只滑动到EditText的头部位置。

修改changeScrollView方法:

private void changeScrollView() {

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

mScrollView.scrollTo(0, mScrollView.getChildAt(0).getHeight() - ll4.getHeight() - sll.getHeight());

}

}, 100);

}

注意:mScrollView.getHeight()方法并不能获取到ScrollView的总高度,想要获取ScrollView的总高度可以使用mScrollView.getChildAt(0).getHeight()

如下图:

软键盘显示在布局之下并不遮挡输入框.png

android虚拟键盘挡住布局,让Android软键盘不遮挡布局相关推荐

  1. android keyboard颜色,Android基于KeyboardView和Keyboard实现自定义软键盘 自定义键盘背景色...

    Android基于KeyboardView和Keyboard实现自定义软键盘 在一些特别的情况下我们需要去自定义键盘 例如: 银行app的密码输入之类的 笨方法就是直接使用布局写我们的自定义软键盘 但 ...

  2. Android基于KeyboardView和Keyboard实现自定义软键盘 自定义键盘背景色

    Android基于KeyboardView和Keyboard实现自定义软键盘 在一些特别的情况下我们需要去自定义键盘 例如: 银行app的密码输入之类的 笨方法就是直接使用布局写我们的自定义软键盘 但 ...

  3. android 获取键盘回车键事件,设置软键盘回车键显示内容,点击空白处隐藏软键盘

    首先设置EditText的回车属性 drawable文件 @drawable/editcolor <?xml version="1.0" encoding="utf ...

  4. 关于Android透明状态栏的使用以及与软键盘冲突(导致SrollView不能滑动)的解决办法

    1.透明状态栏实在android4.4以上才有的新功能 (1)通过在style文件中设置 <item name="android:windowTranslucentStatus&quo ...

  5. android点击软键盘外面的区域关闭软键盘解决办法

    很多时候在一个页面有多个输入框或者输入框加选择框的时候,我们需要根据用户的点击去关闭软键盘. 在Activity中加入以下代码即可 /**重写dispatchTouchEvent* 点击软键盘外面的区 ...

  6. 安卓之软键盘监听与切换软键盘状态和重新获取EditText焦点

    最近在工作中的时候遇到了关于使用ScrollView作为外层点击内部EditText弹出软键盘滑动页面的问题,百度了好久各种教程,但是对于我的页面来说没有一个有用的,自己花了1天时间终于搞定了,今天在 ...

  7. 计算机软键盘怎么打开,如何打开软键盘,详细教您电脑怎么打开软键盘

    软键盘有什么好处?在网上付款或者要打开一些机密的文件需要输入密码,这时候软键盘就可以派上用场了,这也是为了防止木马记录键盘输入的密码.那么该怎么去打开软键盘呢?下面,小编就来跟大家介绍电脑打开软键盘的 ...

  8. android实现底部弹出框与软键盘冲突(全面屏虚拟键适配)

    普通的底部弹出框大家都可以很熟练的使用了,无非是一个diaolog的事情,但是当dialog中含有输入框之后,软键盘与dialog的冲突可以说是十分坑了...更别说加上底部虚拟键了,这么一个小功能磨得 ...

  9. android 虚拟按键挡住布局,Android 关于导航栏(虚拟按键)遮挡PopupWindow底部布局的问题...

    我们自定义popupWindow的时候,一般会设置这些参数 setContentView(contentView); //设置高度为屏幕高度 setWidth(UIUtils.getScreenHei ...

  10. android 手机键盘输入法,如何控制输入法软键盘的出现方式

    调用 open(null);/** * 当前弹出则关闭 * 否则弹出 * @param v */ @SuppressWarnings("static-access") public ...

最新文章

  1. Learn Java - Chapter 1 变量(Variables)-数组(Arrays)
  2. wxWidgets编译安装gtk问题的解决办法
  3. SVN打分支及主干合并到分支
  4. 机器学习-集成学习-提升树-Xgboost
  5. 冒泡法排序c语言函数模板,使用模板技术的冒泡排序
  6. mybatis学习(55):延迟加载
  7. springboot整合dubbo\zookeeper做注册中心
  8. Linux 根据服务名字找安装路径
  9. mysql awk_Awk实用手册(全)
  10. Atitit 编程语言语言规范总结 目录 1. 语言规范 3 2. Types 3 2.1.1. Primitive types 3 2.1.2. Compound types 4 3. State
  11. java简单代码练习
  12. 数据库分页技术的实现
  13. csdn上面文章转发
  14. 空气质量(air quality) 简称:AQI 计算AQI等笔记
  15. 如何解读链式中介作用分析结果?
  16. mysql数据库中查看数据库当前连接数
  17. 浪潮服务器重置密码方法
  18. 数据分析师要掌握SQL到什么程度?
  19. Netty02-入门
  20. 首师大附中科创教育平台 我的刷题记录 0324 99999999海岛帝国:运输资源

热门文章

  1. 2020年计算机科学与技术学校排名,2020年全国计算机科学与技术专业大学排名
  2. python 朋友圈点赞收费吗_微信点赞扣费是真是假 微信点赞要收钱了吗
  3. createjs开发教程
  4. 飞鸽传书——短信接口
  5. 函数与事件吧,未整理
  6. ssm校园拼车服务系统毕业设计源码211633
  7. ccf论文分级_论文等级如何划分
  8. Python(py3fdfs)上传到fastdfs配置store_serv.ip_addr问题
  9. java 反射无参方法_无参构造方法 ? 反射
  10. 东大22春《计算机应用基础》在线平时作业3_100分参考非答案