本文来自网易云社区

作者:孙有军


  当一个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音频系统探究——从SoundPool到AudioHardware
  2. 让你自己写的Android的Launcher成为系统中第一个启动的,也是唯一
  3. android的ImageView中XML属性src和background的区别
  4. 一、Android体系及系统架构
  5. Android布局之LinearLayout weight属性的理解
  6. Android学习心得之二——Android系统架构图及简单的系统架构介绍
  7. Android获取系统的硬件信息、系统版本以及如何检测ROM类型

随机推荐

  1. SQLSERVER的版本信息和SP补丁信息查看方
  2. SQL Server设置主键自增长列(使用sql语句
  3. 常用SQL语句(嵌套子查询/随机等等)详细整
  4. SQL语句的各个关键字的解析过程详细总结
  5. 存储过程实现(可带查询条件/万能分页/通
  6. 获取数据库中两个时间字段的相差天数及AB
  7. 向数据库中插入数据并返回当前插入的行数
  8. sql函数实现去除字符串中的相同的字符串
  9. SQLSERVER的非聚集索引结构深度理解
  10. SQL Server简单模式下误删除堆表记录恢复