Android编程之ListView和EditText发布帖子隐藏软键盘功能详解

作者:fancylovejava 时间:2023-11-06 23:09:55 

本文实例讲述了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,ListView,EditText,软键盘
0
投稿

猜你喜欢

  • Java调用linux shell脚本的方法

    2022-03-25 23:09:46
  • Java7之forkjoin简介_动力节点Java学院整理

    2023-08-31 14:08:28
  • Springboot轻量级的监控组件SpringbootAdmin

    2023-08-25 10:08:31
  • java web开发之购物车功能实现示例代码

    2023-01-24 16:52:55
  • 解决Spring Batch框架job任务只跑一次的问题

    2023-01-07 00:13:53
  • C#接口interface用法实例

    2023-11-07 11:55:54
  • java selenium Selenium IDE介绍及用法

    2023-11-21 06:41:22
  • Android 图片处理缩放功能

    2023-09-29 13:59:54
  • 安卓逆向分析之酷狗signature案例分享

    2022-12-06 21:23:37
  • Android内置SQLite的使用详细介绍

    2021-10-24 11:44:17
  • 一篇文章带你了解Java 中序列化与反序列化

    2021-11-27 21:19:27
  • Android沉浸式状态栏的实现代码

    2023-08-21 05:52:08
  • java 获取对象中为null的字段实例代码

    2023-08-28 06:32:53
  • Android通过原生APi获取所在位置的经纬度

    2022-11-12 17:56:14
  • 深入讲解java线程与synchronized关键字

    2023-08-29 13:56:00
  • C#实现时间戳与标准时间的互转

    2023-07-16 08:09:38
  • Springboot-Starter造轮子之自动锁组件lock-starter实现

    2022-01-21 03:53:59
  • Flutter的键值存储数据库使用示例详解

    2023-10-15 02:13:15
  • 使用mybatis-plus-generator进行代码自动生成的方法

    2021-09-03 00:50:18
  • Android动画之3D翻转效果实现函数分析

    2022-08-07 12:37:42
  • asp之家 软件编程 m.aspxhome.com