本文来自网易云社区

作者:孙有军


  当一个activity中含有输入框时,我们点击输入框,会弹出输入法界面,整个界面的变化效果与manifest中对应设置的android:windowSoftInputMode属性有关,一般可以设置的值如下,

   
   具体怎么设置可以查看官方文档。今天主要解决当输入法弹出时会覆盖输入框的问题。

什么情况会覆盖?

   当android的应用中如果一个activity设置了全屏属性Theme.Light.NotittleBar.Fullscreen或者设置了activity对应的主题中android:windowTranslucentStatus属性,设置方式为:`true`,这是如果对应的页面上含有输入框,将会导致点击输入框时软键盘弹出后键盘覆盖输入框,导致输入框看不见。

为什么?

   这其实是因为在全屏时,adjustResize属性已经失效了,该问题是系统的一个bug,[参考链接](http://code.google.com/p/android/issues/detail?id=5497)。adjustResize不生效,那有没有其他方法来解决呐? 这时我们可以设置adjust属性为adjustPan属性,该属性不会失效,但是由于adjustPan会将页面整体平移,以留出输入法空间,会有一个抖动的效果,体验很差,哪有没有体验效果更好的方法呐?

解决方案:

   如果跟布局采用FrameLayout,则可以复写一个自定义FrameLayout,同时设置FrameLayout的android:fitsSystemWindows属性为true。xml设置如下
   
   采用如上其中的任何一种方法就可以解决输入法弹出后覆盖输入框问题。

其他问题?

   在我们使用的过程中发现有用户反馈,说只要进入我们采用该布局的页面就会崩溃,我们查看了崩溃日志,发现有部分手机都使用了相同的一个安卓系统,并且版本都是19,android4.4.x,一个被重写过的系统,该系统的代码加载方式被重写了。

为什么会崩溃?

   我们代码使用到了WindowInsets,该类是api 20才提供的,因此19的系统中其实是没有该代码的,但是该系统在xml的inflate的时候就解析了该类,导致classNotFound。

新的解决方案!

   新的解决方案还是采用了上述的方式,不过会针对不同的版本写不一样的布局,分别为api 20以上与20以下提供不同的布局,这是采用系统的限定符实现的,之后20以上的原样采用上述的方式,20以下去掉onApplyWindowInsets复写,这样不同的版本加载不同的代码就OK了。
 @Override    public final WindowInsets onApplyWindowInsets(WindowInsets insets) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {            mInsets[0] = insets.getSystemWindowInsetLeft();            mInsets[1] = insets.getSystemWindowInsetTop();            mInsets[2] = insets.getSystemWindowInsetRight();            return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0,                    insets.getSystemWindowInsetBottom()));        } else {            return insets;        }    }

总结

   到此整个解决方案已经完成了,如过有更新的解决方式望大家分享。



网易云免费体验馆,0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区


相关文章:
【推荐】 使用QUIC
【推荐】 质量报告之我见
【推荐】 abtest-system后台系统设计与搭建

更多相关文章

  1. Android(安卓)下的视频播放器faplayer 编译
  2. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流
  3. Android系列教程之六:TextView小组件的使用--附带超链接和跑马灯
  4. Android(安卓)ListView 滑动背景为黑色的解决办法
  5. android中定时开关机的实现
  6. Android(安卓)sdk manager不能更新下载缓慢的解决方法
  7. Android布局之LinearLayout weight属性的理解
  8. android的ImageView中XML属性src和background的区别
  9. UiAutomator通过ant实现快速调试

随机推荐

  1. Android(安卓)EditView属性详细介绍
  2. Android资源文件 - 使用资源存储字符串
  3. Android(安卓)NDK 开发教程一:安装NDK
  4. 基本架构
  5. Android电源管理
  6. android的selector背景选择器
  7. Android基础类之BaseAdapter
  8. OpenCV在Android平台上的应用
  9. 一、mono for android学习:什么是mono for
  10. Android(安卓)原生WebView的使用