ListView和EditText发布帖子隐藏软键盘
来源:互联网 发布:控制上网行为的软件 编辑:程序博客网 时间:2024/06/05 04:36
在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() {@Overridepublic 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
@Overridepublic 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的功能。
996啊,今天做俯卧撑把牛仔裤给撑开了。衰啊!!!
- ListView和EditText发布帖子隐藏软键盘
- EditText软键盘的显示和隐藏
- EditText光标控制和软键盘隐藏
- 关于ListView、EditText、光标、和软键盘
- 隐藏EditText的软键盘
- EditText 关于隐藏软键盘.
- EditText 显示隐藏软键盘
- ListVIew EditText 软键盘 光标
- 日积月累:EditText软键盘的显示和隐藏
- 日积月累:EditText软键盘的显示和隐藏
- android EditText软键盘的隐藏和显示
- PopupWindow中使用EditText软键盘的弹出和隐藏
- PopupWindow中使用EditText软键盘的弹出和隐藏
- android Edittext 监听软键盘弹出显示和消失隐藏
- EditText和软键盘
- listview的edittext如何获得焦点,android 软键盘的显示与隐藏
- Activity中 EditText 隐藏软键盘
- EditText隐藏软键盘的方法
- CRecordsetBindObject优化
- 优先队列(利用二叉堆实现)
- 重造轮子-最小栈
- PopupWindow的特殊情况
- PHP防止SQL注入自带函数分析
- ListView和EditText发布帖子隐藏软键盘
- NYOJ 949 哈利波特
- STM32 USART 输入输出C库函数重定向理解
- emacs常见变量和函数【转载】
- IL思路及遇到的问题、解决方法
- HDU 5458 Stability【树链剖分】
- iar通过Terminal I/O调试
- C++捕捉关闭控制台应用程序事件
- 使用Spring MVC上传图片