Android EditText被软键盘遮盖处理

2024-06-03 12:38

本文主要是介绍Android EditText被软键盘遮盖处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

纵观百态 2016-10-13 21:19

这两天android app新增了透明栏效果,结果发现键盘弹起后会遮盖屏幕底部的EditText,没有像想象中的调整窗口大小,并滚动ScrollView,将EditText显示在键盘上方。之前也遇到过类似问题,所以解决后就干脆写把所有关于EditText和键盘之间问题和解决思路都记录一下,以便以后查阅。

一、在5.0以前,如果EditText设置了gravity=“center|right”其中之一且同时设置了singleLine=“true”,就会导致屏幕底部的EditText连续点击弹出键盘时,从第二次开会一直遮挡住EditText。

5.0+则不会有该问题,解决办法也简单,在EditText外层包裹ScrollView,并设置键盘模式为adjustResize模式即可(两者缺一不可)。

二、按上面描述的解决办法,一直没什么问题,直到最近加了透明栏效果,键盘模式仿佛直接失效,每次点击底部EditText时,键盘都从底部弹起,窗口大小也不会调整,底部EditText也会被遮盖。最后发现是当使用getWindow.getDecorView.setSystemUiVisibility方法设置了

SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

或SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION ,

或者设置了 window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)时,

会引发EditText被键盘遮盖问题。

因为透明栏效果是从4.4开始支持,也就导致从4.4开始项目就存在这个BUG,当然只考虑5.0+的透明栏效果,可以直接设置状态栏颜色实现透明栏效果,我这里由于项目需要必须要从4.4开始支持,所以必须解决这个问题。

正常情况下,系统UI会占用app一些空间,例如状态栏、键盘、导航栏等,也就是说我们的app UI不会出现在系统UI之下,但从测试结果来看,为了占用状态栏空间或全屏,设置了上面的一些属性后,就会被系统UI覆盖。

解决方法:监听界面容器的layout变化,当发生变化时,通过检查窗口可见区域高度,判断键盘是否弹起,如果弹起,则修改容器bottom padding,也就是手动实现adjustResize效果,给键盘留出显示空间,这样ScrollView也会自动调整大小,将EditText显示在键盘上方。

public class KeyboardPatch
{private Activity activity;private View decorView;private View contentView;/*** 构造函数* @param act 需要解决bug的activity* @param contentView 界面容器,activity中一般是R.id.content,也可能是Fragment的容器,根据个人需要传递* */public KeyboardPatch(Activity act, View contentView){this.activity = act;this.decorView = act.getWindow.getDecorView;this.contentView = contentView;}/*** 监听layout变化* */public void enable{activity.getWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);if (Build.VERSION.SDK_INT >= 19){decorView.getViewTreeObserver.addOnGlobalLayoutListener(onGlobalLayoutListener);}}/*** 取消监听* */public void disable{activity.getWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);if (Build.VERSION.SDK_INT >= 19){decorView.getViewTreeObserver.removeOnGlobalLayoutListener(onGlobalLayoutListener);}}private ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener{@Overridepublic void onGlobalLayout{Rect r = new Rect;decorView.getWindowVisibleDisplayFrame(r);int height = decorView.getContext.getResources.getDisplayMetrics.heightPixels;int diff = height - r.bottom;if (diff != 0){if (contentView.getPaddingBottom != diff){contentView.setPadding(0, 0, 0, diff);}}else{if (contentView.getPaddingBottom != 0){contentView.setPadding(0, 0, 0, 0);}}}};
}

这篇关于Android EditText被软键盘遮盖处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1027009

相关文章

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.