Android编程之ListView和EditText发布帖子隐藏软键盘功能详解
本文实例讲述了Android编程之ListView和EditText发布帖子隐藏软键盘功能。分享给大家供大家参考,具体如下:
在Android开发中,手动调用软件盘的隐藏和显示有时候也是非常常见的需求。
EditText控件实现了点击打开软键盘输入功能,but why ? 为什么EditText可以点击弹出keyboard,而TextView却不可以,EditText继承TextView做了哪些修改呢?关于这些问题得查看相关具体代码如何实现可以参考,看似简单的控件其实系统封装实现的很复杂。这里告诫和我一样一路自学android的开发者善于思考事件背后的本质,共勉。
开发有个布局是最外层是FrameLayout,包裹了ListView,bottom底部是个edit输入框,当点输入框打开keyboard时候,需要下滑listView隐藏keyboard,但上滑继续滑动listView。
刚开始,我尝试了给listview设置clickListener,设置onScrollListener,重写它的onTouchEvent方法,但是发现并不能达到自己满意的效果(发现code有段时间了,自己都有种修改代码不修改自己满意为止不罢休的纠结感)。
为什么不满意,因为每次listview滑动的时候调用hide keyboard会导致listview闪一下重影现象,因为listview正在滑动调用了hide keyboard,并且Activity设置的是adjustResize会重新onLayout整个布局。(PS:之前也纠结过这个问题,adjustResize属性导致底部的Edit没有跟着keyboard移动,而是等keyboard打开后Edit在layout到合适的位置了。最后总结出的问题是需要调整布局,并且用adjustPan属性,相信类似微信聊天界面肯定也是这样做的,有更好的办法欢迎留言探讨!)
重新了最外层的FrameLayout的onInterceptTouchEvent拦截touch方法。直接贴代码了
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//键盘开 && 第一个scroll dy》0
if(showSoftInput) {
if(mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
}
mVelocityTracker.addMovement(ev);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downY = (int) ev.getY();
showDispatchTouch = true;
break;
case MotionEvent.ACTION_MOVE:
if(downY ev.getY()) {
showDispatchTouch = true;
} else {
showDispatchTouch = false;
mVelocityTracker.computeCurrentVelocity(1000);
if(mVelocityTracker.getYVelocity() 200 && mContext instanceof ActivityReplyDetail) {
((ActivityReplyDetail)mContext).hideSoftInput();
}
}
break;
default:
break;
}
}
return !showDispatchTouch || isAnimating || super.onInterceptTouchEvent(ev);
}
当然这里只有当keyboard弹出的时候才能拦截touch方法了,所以就要检测keyboard是否已弹出。如何检测
mReplyEditLayout.addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right,
int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
if(!mOrientationChanged) {
if(top oldTop) {
if(!mEditTouchedFlag)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
//键盘隐藏
mSoftInputShow = false;
mPullToNextLayout.setDispatchTouch(true);
mPullToNextLayout.setIsShowSoftInput(false);
} else if (top < oldTop) {
//键盘显示
mSoftInputShow = true;
mPullToNextLayout.setIsShowSoftInput(true);
}
mEditTouchedFlag = false;
}
}
});
OnLayoutChangeListener监听到控件的layout的变化。View还有个监听getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener()
这个监听方法被调用的时机据我测试时在上面监听之后回调的。
这里还有实现横竖屏切换,横屏是点击输入框得先回到竖屏再弹出keyboard,就用到了上面两个listener,还有个onConfigurationChanged。
so当一步步根据自己的调试终于达到自己的满意了。
EditText收起keyboard其实更简单,直接重写onTouchEvent
@Override
public boolean onTouchEvent(MotionEvent event) {
if(mSoftInputShow) {
switch (event.getAction()) {
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
imm.hideSoftInputFromWindow(getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
return true;
}
}
return super.onTouchEvent(event);
}
InputMethodManager.HIDE_NOT_ALWAYS
这个参数是告诉我们多次调用hideSoft不会一直调用,哈哈哈。
其实Edit是个很高的Edit,这种方法,会导致跟listview一样,edit在滑动时同时收起了keyboard导致重影,因为是adjustResize和布局的原因。
所以其实这里如果系统能给我们封装好方法,点击show keyboard,再点 hide keyboard并且不会滑动Edit就好了,所以想修改代码,必须得了解edit为什么能实现点击show keyboard的功能。
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android控件用法总结》、《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android数据库操作技巧总结》及《Android资源操作技巧汇总》
希望本文所述对大家Android程序设计有所帮助。
- 回归分析技术|机器学习
- 用PHP蜘蛛做旅游数据分析
- 一秒找出用时间和随机数生成的上传文件名
- Java之集合的遍历与迭代器
- Java之字符串String,StringBuffer,StringBuilder
- JavaScript深入浅出补充——(一)数据类型,表达式和运算符
- Oracle数据库(一)概述、基础与简单操作
- Oracle数据库(二)常用关键字以及函数
- Oracle数据库(三)表操作,连接查询,分页
- 正式学习第一天下午——基础标签及其属性
- 正式学习第二天上午——常用标签及列表 0605
- Java之面向对象例子(三) 多态,重写,重载,equals()方法和toString()方法的重写
- Java之IO流补充
- JavaWeb 例子 JDBC+JSP登陆注册留言板
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- php使用redis的几种常见操作方式和用法示例
- 使用memory_profiler监测python代码运行时内存消耗方法
- php 多进程编程父进程的阻塞与非阻塞实例分析
- php数组指针函数功能及用法示例
- thinkphp5框架路由原理与用法详解
- ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能示例
- php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
- 对python 命令的-u参数详解
- ThinkPHP5.1+Ajax实现的无刷新分页功能示例
- Python推导式简单示例【列表推导式、字典推导式与集合推导式】
- Python 从相对路径下import的方法
- Python随机生成身份证号码及校验功能
- 对python的bytes类型数据split分割切片方法
- PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
- python 实现数字字符串左侧补零的方法