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

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

概述本文实例讲述了Android编程之ListView和EditText发布帖子隐藏软键盘功能。分享给大家供大家参考,具体如下:

本文实例讲述了AndroID编程之ListVIEw和EditText发布帖子隐藏软键盘功能。分享给大家供大家参考,具体如下:

在AndroID开发中,手动调用软件盘的隐藏和显示有时候也是非常常见的需求。

EditText控件实现了点击打开软键盘输入功能,but why ? 为什么EditText可以点击d出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);  }

当然这里只有当keyboardd出的时候才能拦截touch方法了,所以就要检测keyboard是否已d出。如何检测

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()这个监听方法被调用的时机据我测试时在上面监听之后回调的。

这里还有实现横竖屏切换,横屏是点击输入框得先回到竖屏再d出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的功能。

更多关于AndroID相关内容感兴趣的读者可查看本站专题:《Android控件用法总结》、《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity *** 作技巧总结》、《Android数据库 *** 作技巧总结》及《Android资源 *** 作技巧汇总》

希望本文所述对大家AndroID程序设计有所帮助。

总结

以上是内存溢出为你收集整理的Android编程之ListView和EditText发布帖子隐藏软键盘功能详解全部内容,希望文章能够帮你解决Android编程之ListView和EditText发布帖子隐藏软键盘功能详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1144868.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存