最近项目有一个比较苦B的需求,需要在用户输入内容之前,弹出推赞窗口,以让用户可以从中选择一些系统推荐的内容。这个需求通过拦截焦点,可以搞掂软键盘和推荐弹窗的冲突。但是更苦B的是,输入控件设计在屏幕的最下面(Bottom),这个导致了一个十分怪异的现象:
默认下输入控件是没有焦点的,当用户点击时,系统软键盘会自动优先弹出。因为有推荐功能,我们要先让用户看到推荐弹出窗。那就要把原来弹出的软件人为地隐藏,再弹出推荐窗,问题就出在这个环节上。
由于软件盘得隐藏有一定的时间,弹窗定苗就定在输入控件原来的位置(就是被软键盘推高的位置),软键盘隐藏后,弹窗就出现在屏幕的中部,但是输入控件已经回落到底部了!
解析问题之前,我们先了解一下,软键盘弹出的方式:
在AndroidManifest.xml文件中的Activity标签的属性中,可以找到android:windowSoftInputMode,其各个值的意义见下:
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
我设置的就是stateHidden|adjustResize,所以软键盘会托起activity的UI,隐藏的时候,UI重画,那当然就是耗费一点时间了。
既然知道问题,那解决方案就有了:监听Activity重画的状态,当Activity重画完才弹出推荐窗。
思路和简单,实现也不复杂,Activity重画,必定会回调某些内部的函数,我们只要重写那些函数,再发通知出来就可以了。
Activity的主要布局是RelativeLayout,由于属性设的是adjustResize,当软键盘隐藏时,会调用RelativeLayout的onSizeChanged方法,我们就从这里入手:
public class ResizeLayout extends RelativeLayout {
public ResizeLayout(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public ResizeLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public ResizeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public void setOnResizeListener(OnResizeListener l) {
mListener = l;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (mListener != null) {
mListener.OnResize(w, h, oldw, oldh);
}
}
private OnResizeListener mListener;
public interface OnResizeListener {
void OnResize(int w, int h, int oldw, int oldh);
};
}
我们重写onSizeChanged方法,并为自定义的layout定义一个回调接口,其实现的子类只要实现该接口,当使用此layout的Activity在软键盘隐藏时,就会通知到实现的子类了!
分享到:
相关推荐
代码来源: 从facebook React源码ReactRootView中抽离CustomGlobalLayoutListener,用于监听Android系统软键盘的弹出与关闭。 ...软键盘弹出和关闭时,可同时回调 keyboardHeight 软键盘的高度值。
Android是一个针对触摸屏专门设计的操作系统,当点击编辑框,系统自动为用户弹出软键盘,以便用户进行输入。 那么,弹出软键盘后必然会造成原有布局高度的减少,那么系统应该如何来处理布局的减少?我们能否在应用...
SoftKeyboardListenDemo 监听软键盘
前言:前端时间也是应项目的需求开始了h5移动端的折腾之旅,在目前中台的基础上扩展了两个ToC移动端项目,下面就是在h5移动端表单页面键盘弹出收起兼容性的一些总结。 问题 在 h5 项目中,我们会经常遇到一些表单...
今天来了一个问题:软键盘无法弹出。分析后是因为系统判断当前有外接硬键盘,就会隐藏软键盘。但实际情况并不是这么简单,该问题只有在特定条件下偶现,具体分析过程就不说了,就是软硬键盘支持上的逻辑问题。借着这...
在这一段时间的使用过程中出现了很多兼容性问题,各种机型(有无虚拟按键)、系统版本(高度返回值是否包含状态栏)返回的软键盘高度与实际的软键盘高度不同,监听的调用方式也不尽相同,最后导致界面出现错位。...
前段时间工作中遇到了一个问题,即在软键盘弹出后想监听back事件,但是在Activity中重写了对应的onKeyDown函数却怎么也监听不到,经过一阵Google之后才发现需要重写View的dispatchKeyEventPreIme函数才行。...
Press f8 for bbs popup 按F8弹出BBS网页 Press ALT+F2 to boot from system Recovery 按ALT+F2进入根录进行设置 PC2-4300 Dual Channel interleaved 双通道技术 Initializing usb Controllers..done 装载USB控制 ...
Linux挂装CD-ROM后,会锁定CD—ROM,这样就不能用CD- ROM面板上的Eject按钮弹出它。但是,当不再需要光盘时,如果已将/cdrom作为符号链接,请使用umount/cdrom来卸装它。仅当无用户正在使用光盘时,该命令才会成功。...
性能,不会出现任何不稳定的现象 ============================================================ 主 要 功 能 ============================================================ 1. 屏幕广播:实时传送...
教师能够随时监看和监听某个学生的信息,和控制学生的键盘、鼠标,进行“手把手”式的指导,并可以在学生中间任意切换; 窗口遥控辅导,凌波多媒体电子教室软件的窗口智能滚动遥控,在教师进行其他各项教学功能的...
教师能够随时监看和监听某个学生的信息,和控制学生的键盘、鼠标,进行“手把手”式的指导,并可以在学生中间任意切换; 窗口遥控辅导,首创的窗口智能滚动遥控,在教师进行其他各项教学功能的同时,教师可以对多...
"听"即监听电源风扇、软/硬盘电机或寻道机构、显示器变压器等设备的工作声音是否正 常。 "闻"即辨闻主机、板卡中是否有烧焦的气味,便于发现故障和确定短路所在地。 "摸"即用手按压管座的活动芯片,看芯片是否松动...
教师能够随时监看和监听某个学生的信息,和控制学生的键盘、鼠标,进行“手把手”式的指导,并可以在学生中间任意切换; 窗口遥控辅导,凌波多媒体教室软件的窗口智能滚动遥控,在教师进行其他各项教学功能的同时...
教师能够随时监看和监听某个学生的信息,和控制学生的键盘、鼠标,进行“手把手”式的指导,并可以在学生中间任意切换; 窗口遥控辅导,凌波多媒体教室软件的窗口智能滚动遥控,在教师进行其他各项教学功能的同时,...
传输速度快,控制屏幕,发送Ctrl+Alt+Del,剪贴板操作,7种色彩显示方式,等...... 键盘记录 可记录中英文信息,离线记录(记录上限50M)功能 远程终端 一个简单shell 系统管理 进程管理,窗口管理,拨号上网...
学生提问:为什么即使我没有给多行文本域编写右键菜单,但当我在多行文本域上单击右键时一样会弹出右键菜单? 418 11.7 在AWT中绘图 418 11.7.1 画图的实现原理 418 11.7.2 使用Graphics类 419 11.8 处理位图 ...