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

 更新时间:2017年08月07日 12:20:21   作者:fancylovejava  
这篇文章主要介绍了Android编程之ListView和EditText发布帖子隐藏软键盘功能,结合实例形式分析了Android控件调用、隐藏软键盘的原理与具体实现技巧,需要的朋友可以参考下

本文实例讲述了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程序设计有所帮助。

相关文章

  • Android Studio 4.0 正式发布在Ubuntu 20.04中安装的方法

    Android Studio 4.0 正式发布在Ubuntu 20.04中安装的方法

    这篇文章主要介绍了Android Studio 4.0 正式发布如何在Ubuntu 20.04中安装,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Android.mk引入第三方jar包和so库文件的方法

    Android.mk引入第三方jar包和so库文件的方法

    这篇文章主要介绍了Android.mk引入第三方jar包和so库文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • android播放器实现歌词显示功能

    android播放器实现歌词显示功能

    这篇文章主要为大家详细介绍了android播放器实现歌词显示功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Android ListView 默认选中某一项实现代码

    Android ListView 默认选中某一项实现代码

    这篇文章主要介绍了Android ListView 默认选中某一项实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Android 读取sdcard上的图片实例(必看)

    Android 读取sdcard上的图片实例(必看)

    下面小编就为大家带来一篇Android 读取sdcard上的图片实例(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 一篇文章弄懂kotlin的扩展方法

    一篇文章弄懂kotlin的扩展方法

    这篇文章主要给大家介绍了如何通过一篇文章弄懂kotlin的扩展方法,文中通过示例代码介绍的非常详细,对大家学习或者使用kotlin具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • ViewPager打造轮播图Banner/引导页Guide

    ViewPager打造轮播图Banner/引导页Guide

    这篇文章主要为大家详细介绍了ViewPager打造轮播图Banner和引导页Guide,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • flutter showModalBottomSheet常用属性及说明

    flutter showModalBottomSheet常用属性及说明

    这篇文章主要介绍了flutter showModalBottomSheet常用属性及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Android自定义view制作绚丽的验证码

    Android自定义view制作绚丽的验证码

    这篇文章主要介绍了Android自定义view制作绚丽的验证码的相关资料,需要的朋友可以参考下
    2016-03-03
  • Android Handler内存泄漏详解及其解决方案

    Android Handler内存泄漏详解及其解决方案

    在android开发过程中,我们可能会遇到过令人奔溃的OOM异常,这篇文章主要介绍了Android Handler内存泄漏详解及其解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08

最新评论