android监听软键盘弹出弹回事件
概述
针对“软键盘的遮挡”问题,最简单的方式就是将activity的windowSoftInputMode设置成adjustResize或者adjustPan。
android:windowSoftInputMode="adjustResize"
android:windowSoftInputMode="adjustPan"
其效果一般如下:
如上图,这样设置后能保证“当前操作的布局”在软键盘之上。
但是实际业务场景,可能需要的是“将整块布局”设置在软键盘之上,即Demo中的两个输入框和按钮都需要在软键盘之上。
如果需要实现这种需求,那么开发者就必须要监听软键盘的弹出弹回事件,然后手动来调整布局。
监听源码
监听实现的原理如下:
- 监听当前页面contentView的布局变化
- 如果contentView上移,那么是软键盘弹出,如果contentView底部与decorview一样,那么是弹回。
public class KeyBoardListenerHelper {//constantsprivate static final String TAG = "KeyBoardListenerHelper";//dataprivate WeakReference<Activity> weakActivity = null;//避免内存泄漏,使用弱引用private OnKeyBoardChangeListener onKeyBoardChangeListener;private final ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener =new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {if (!isActivityValid() || onKeyBoardChangeListener == null) {return;}try {Rect rect = new Rect();weakActivity.get().getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);int screenHeight = weakActivity.get().getWindow().getDecorView().getHeight();int keyBoardHeight = screenHeight - rect.bottom;onKeyBoardChangeListener.OnKeyBoardChange(keyBoardHeight > 0, keyBoardHeight);} catch (Exception e) {Log.e(TAG, "onGlobalLayout error:" + e.getMessage());}}};public KeyBoardListenerHelper(Activity activity) {if (activity == null) {return;}weakActivity = new WeakReference<>(activity);try {//设置后才可以监听到软键盘的弹出,此处不能设置SOFT_INPUT_ADJUST_UNSPECIFIED或者SOFT_INPUT_STATE_UNSPECIFIED,其他都可以.activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);View content = weakActivity.get().findViewById(android.R.id.content);content.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);} catch (Exception e) {Log.e(TAG, "KeyBoardListenerHelper error:" + e.getMessage());}}//在不使用的时候需要及时销毁,避免内存泄漏或造成额外开销public void destroy() {Log.i(TAG, "destroy");if (!isActivityValid()) {return;}try {View content = weakActivity.get().findViewById(android.R.id.content);content.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener);} catch (Exception e) {Log.e(TAG, "destroy error:" + e.getMessage());}}public void setOnKeyBoardChangeListener(OnKeyBoardChangeListener listener) {Log.i(TAG, "setOnKeyBoardChangeListener");this.onKeyBoardChangeListener = listener;}public interface OnKeyBoardChangeListener {void OnKeyBoardChange(boolean isShow, int keyBoardHeight);}public boolean isActivityValid() {return weakActivity != null && weakActivity.get() != null;}
}
监听调用
调用步骤:
- 在需要的地方初始化
- 根据自己需要在软键盘弹出和弹回的时候控制布局变化
- 在不使用的及时释放不使用的监听器
public class MainActivity extends Activity {private KeyBoardListenerHelper keyBoardListenerHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);keyBoardListenerHelper = new KeyBoardListenerHelper(this);keyBoardListenerHelper.setOnKeyBoardChangeListener(new KeyBoardListenerHelper.OnKeyBoardChangeListener() {@Override public void OnKeyBoardChange(boolean isShow, int keyBoardHeight) {//此处可以根据是否显示软键盘,以及软键盘的高度处理逻辑Log.i("testtest", "isShow: " + isShow + " keyBoardHeight:" + keyBoardHeight);}});}@Override protected void onDestroy() {super.onDestroy();if (keyBoardListenerHelper != null) {keyBoardListenerHelper.destroy();//避免内存泄漏,需要及时释放}}
}
android监听软键盘弹出弹回事件相关推荐
- Android 监听软键盘的高度并解决其覆盖输入框的问题
1.前言 在某些项目中,我们常常需要自定义一个输入框,软键盘弹出时就把输入框顶上去,关闭时输入框再回到原位(比如下方的效果图,实际上各种 App 中的聊天界面和发布评论的界面大体都是这样).在这个过程 ...
- Android 监听软键盘按键的三种方式
前言: 我们在Android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的"Go"按键加载url页面:在点击搜索框的时候,点 ...
- android 软键盘 状态,Android监听软键盘状态
监听软键盘隐藏或显示,代码如下: /** * 监听软键盘状态 */ private void listenerInput() { final LinearLayout ll_main = (Linea ...
- Android监听软键盘开启关闭状态
最近公司项目有一个功能点是监听软键盘的打开关闭状态,然后来展开不同的布局,后来在StackOverFlow上面找到一位大神提供了解决办法,大致做法如下: 在你需要监听状态的界面activity或者fr ...
- Android开发之监听软键盘状态(弹出收回)
版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/81511764 出自:shusheng007 ...
- android 键盘回车按钮事件,android 监听软键盘 回车键
InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.); imm.hideSoftI ...
- android监听键盘的隐藏,Android监听软键盘的显示和隐藏
使用步骤 xml 布局文件布局,和普通的控件一下 获取SoftInputCanListenerEditText 实例,并设置监听器 Activity 注册的时候android:windowSoftIn ...
- android 键盘隐藏监听,安卓监听软键盘弹出与隐藏的两种方法
需求: 现在有一个需求是点击一行文本框,弹出一个之前隐藏的输入框,输入完成后按返回键或者其他的东西隐藏键盘和输入框,将输入框的内容填充到文本框中. 实现: 拿到这个需求的第一反应就是写一个监听来监听键 ...
- Android App监听软键盘按键的三种方式(转)
最近有类似需求,在csdn上刚好发现,粘贴过来,以防止忘记喽 前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的&quo ...
- Android App监听软键盘按键的三种方式
前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的"GO"按键加载url页面:在点击搜索框的时候,点 ...
最新文章
- LeetCode_数组_中等题
- 什么是 SAP Commerce Cloud 的 Paragraph component
- 关于autoupgader的狗屎问题
- 推荐系统国内外团队介绍
- 澄海哪里学机器人编程_少年学机器人编程
- LYCMS自动采集影视视频网源码 安全无后门
- SQL Server中的报表–结合T-SQL和DAX查询以生成有效的报表
- C 语言怎么可能被淘汰呢?
- Java面向对象:对象的概念及面向对象的三个基本特征
- Luogu1886 滑动窗口 /【模板】单调队列
- jenkins pipeline分目录检出多代码库方法
- 乐橙本地录像回放不了_解决大华或乐橙录像机添加摄像头不能显示的密码问题...
- word2010撤销功能的恢复方法
- 暗影精灵4电脑win10系统重装+linux双系统安装
- linux centos 权限审核 polkitd进程 简介
- Win10/Win11下图片扩展安装 HEVC/HEIF/CR2等
- html 带箭头的提示框,css实现对话框-带箭头提示框
- 图解HTTP----web的攻击技术
- Setup time 和 Hold time
- c#程序员面试题汇总,方便自己记录
热门文章
- 【心情】2016ICPC青岛站打铁记
- 清洁机器人--屏幕显示LCD方案接口说明概述
- jt808终端鉴权_GitHub - SmallChi/JT808: JT808协议、GB808协议、道路运输车辆卫星定位系统-北斗兼容车载终端通讯协议(支持2013、2019版本)...
- 合并Windows系统镜像教程(Win 7+win 8.1 合盘)
- 【信管师-资料总结篇】一、立项管理
- 南京信息工程大学 第二届程序设计大赛团队赛 试题
- 我们可能都低估了浪潮存储
- 【​观察】做好数据到介质的连接者 新数据时代浪潮存储的行与思
- python:series详解和数据获取
- 扒一扒那些叫欧拉的定理们(八)——欧拉公式和自然对数的底e