为了更好的用户体验,煎熬了许久,得到这么个解决方案。在此记录下来,以供后来者参考。

  第一部分

    清单文件中组件activity的android:windowSoftInputMode属性值的含义: 

    【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置

    【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示

    【C】stateHidden:用户选择activity时,软键盘总是被隐藏

    【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的

    【E】stateVisible:软键盘通常是可见的

    【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态

    【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示

    【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间

    【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖

   注意:

      1、当对状态栏进行沉浸式处理时,adjustResize和adjustPan模式可能会失效,此时应该给activity的根布局设置此属性:android:fitsSystemWindows="true"。

      2、adjustResize模式下,要想键盘不遮挡输入框,那么就需要使用scrollview来包裹,如果editext所在的直属scrollview下面还有控件(多数时候是一个或者多个按钮),那么键盘上将会出现这些按钮,体验不好;adjustPan模式下,会将布局向上顶出屏幕,以保证输入框始终在视野范围内,所以title会被顶出,而体验差。

  第二部分

    对软键盘的显示和隐藏状态进行监听。目的是解决adjustResize模式下,布局下面的一些悬浮按钮显示在键盘上的问题。

   DecorView decorview=getWindow().getDecorView();

  onGlobalLayoutListener=new ViewTreeObserver.OnGlobalLayoutListener() {
  @Override
   public void onGlobalLayout() {
   Rect rect = new Rect();
   decorview.getWindowVisibleDisplayFrame(rect);
   displayHight = rect.bottom - rect.top;//布局当下的高度
   hight = decorview.getHeight();//屏幕高度
   if (displayHight > hight / 3 * 2) {
          //布局当下的高度大于屏高的2/3,那么键盘处于隐藏的状态
          } else {
          //布局当下的高度小于等于屏高的2/3,那么键盘处于显示的状态
          }
   }
  };
  decorview.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); 第三部分
  
  当adjustResize模式下,使用到
ExpandaleListView控件,且其分组展开项中包含有输入框。这时会出现诸如:输入框依旧被键盘遮挡了;遮挡的输入框没有焦点而不能输入内容;展开和收起分组时自动滚动到焦点所在位置等问题。
  完整的处理方式如下:
    第一步:
      在
ExpandaleListView控件外层套上ScorllView。
      
<ScrollView
          android:id="@+id/sv"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:scrollbars="none">     <com.ruitukeji.bellink.view.NestedExpandaleListView
    android:id="@+id/exListView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:childIndicator="@null"
    android:descendantFocusability="beforeDescendants"//这个属性是决定输入框能不能获取到焦点
    android:divider="@null"
    android:dividerHeight="0dp"
    android:fastScrollEnabled="false"//这个属性是跟嵌套时滚动相关的
    android:groupIndicator="@null" />
      </ScrollView>       ScrollView嵌套
ExpandaleListView时,需要自定义ExpandaleListView控件,如下:
        public class NestedExpandaleListView extends ExpandableListView {

       public NestedExpandaleListView(Context context) {
       super(context);
       }        public NestedExpandaleListView(Context context, AttributeSet attrs) {
       super(context, attrs);
       }        public NestedExpandaleListView(Context context, AttributeSet attrs, int defStyleAttr) {
       super(context, attrs, defStyleAttr);
       }        public NestedExpandaleListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
       super(context, attrs, defStyleAttr, defStyleRes);
       }        @Override
       protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,   MeasureSpec.AT_MOST);        //将重新计算的高度传递回去
       super.onMeasure(widthMeasureSpec, expandSpec);
       }
      }
    第二步:
      给
ExpandaleListView控件设置展开和收起分组的监听事件
      exListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
        @Override
          public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
      exListView.requestFocus();//将焦点从输入框夺回,避免自动滚动到输入框所在的分组。并且需要把焦点给到
ExpandaleListView控件。当把焦点给到这里的v时,这里的监听事件将无法再被执行。
              return false;//true:已经处理的点击事件,那么分组的张开和收起将不会执行,除非,在此句之前通过代码来操作。false:没有处理点击事件,系统自动执行展开或者收起操作。
      }
      });
    第三步:
      因为当收起键盘时,焦点还在输入框的话,那么此时点击分组进行展开或者收起操作,依旧会滚动到焦点所在位置,且顶布局顶显示。这个时候就需要我们去通过监听键盘隐藏来将焦点从输入框夺来给到
ExpandaleListView控件。
    注意:
ExpandaleListView有输入框时,布局尽可能不去复用。必须复用时,自行进行完善。


说明:本文是以ExpandaleListView控件来作为示例的,其它控件雷同,可举一反三而得解决。
以上内容仅供参考,如有问题,烦请留言,共同提高。
鸣谢:
  https://blog.csdn.net/zhuawalibai/article/details/76668047
  
 
 

adjustResize模式下ExpandaleListView中输入框焦点错乱及布局底部的导航栏被顶在键盘上方的处理的更多相关文章

  1. DEBUG模式下, 内存中的变量地址分析

    测试函数的模板实现 /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #defi ...

  2. NAT模式下VMware中CentOS7无法连接外网的解决方法

    故障现象 ----------------------------------------------------------------------------------------------- ...

  3. 在UWP中页面滑动导航栏置顶

    最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...

  4. SharePoint ribbon icons disappeared(网站顶部Top bar 齿轮图标,以及编辑模式下Ribbon中Icon消失)

    Questions: has anyone ever seen this before? all my icons in my ribbon have disappeared. I'm using m ...

  5. 处理EasyUI中tab的切换问题以及accordion左侧导航栏的代码实现

    //左侧导航菜单 function leftMenus() { //$(".easyui-accordion").empty(); $.each(_menus.menus, fun ...

  6. iOS系统中导航栏的转场解决方案与最佳实践

    背景 目前,开源社区和业界内已经存在一些 iOS 导航栏转场的解决方案,但对于历史包袱沉重的美团 App 而言,这些解决方案并不完美.有的方案不能满足复杂的页面跳转场景,有的方案迁移成本较大,为此我们 ...

  7. SAP CRM 将组件整合至导航栏中

    到现在,我们已经可以让组件独立地显示.我们只是运行它.让它显示在Web UI中.让我们把组件整合进导航栏,使我们可以在正常登录Web UI时访问它. 步骤一: 为你的UI组件主窗体创建一个内向插件. ...

  8. zhuang 定制iOS 7中的导航栏和状态栏

    近期,跟大多数开发者一样,我也正忙于对程序进行升级以适配iOS 7.最新的iOS 7外观上有大量的改动.从开发者的角度来看,导航栏和状态栏就发生了明显的变化.状态栏现在是半透明的了,这也就意味着导航栏 ...

  9. iOS 7 教程:定制iOS 7中的导航栏和状态栏

    目录(?)[-] iOS 7中默认的导航栏 设置导航栏的背景颜色 在导航栏中使用背景图片 定制返回按钮的颜 修改导航栏标题的字体 修改导航栏标题为图片 添加多个按钮 修改状态栏的风格 隐藏状态栏 总结 ...

随机推荐

  1. uboot中的中断macro宏

    目录 uboot中的中断macro宏 引入 内存分配 流程概览 普通中断 保存现场 中断函数打印具体寄存器 恢复现场 软中断 空间获取 保存现场 附录速记 疑惑待解 title: uboot中的中断m ...

  2. Docker实践之01-入门介绍

    目录 一.Docker概述 镜像 容器 仓库 二.安装Docker 1.在CentOS上安装Docker 2.在Ubuntu上安装Docker 3.启动docker 4.建立Docker用户组 5.测 ...

  3. C#代码使用Process类调用SWFTools工具

    一.Process类调用SWFTools工具将PDF文档转为swf文档 1 string cmdStr = "D:\\SWFTools\\pdf2swf.exe"; string ...

  4. webpack的按需引入配置

    ant.design插件需要less配合,yarn add babel-plugin-import,webpack4.0的babel文件已经配置到webpackconfig.js中,需要eject暴露 ...

  5. windows安装解压版mysql

    记录下用批处理安装mysql5.7.18的过程与踩到的坑 先在安装目录新建文件my.ini [mysql] default-character-set=utf8 basedir=TODO datadi ...

  6. sonar6.7.2启动报错

    sonar6.7.2启动报错:错误信息如下: es.log java.lang.RuntimeException: can not run elasticsearch as rootsonar.log ...

  7. 通用RSA加密 - PHP+Java+Javascript加密解密

    php端生成 公钥私钥 1.openssl genrsa -out rsa_private_key.pem 1024    私钥 2.openssl rsa -in rsa_private_key.p ...

  8. FFT学习笔记

    快速傅里叶变换FFT(Fast Fourior Transform) 先说一下它能干嘛qwq ​ 傅里叶变换有两种,连续傅里叶变换和离散傅里叶变换,OI中主要用来快速计算多项式卷积. 等一下,卷积是啥 ...

  9. 前端笔记知识点整合之JavaScript(二)关于运算符&初识条件判断语句

    运算符 数学运算符的正统,number和number的数学运算,结果是number.出于面试的考虑,有一些奇奇怪怪的数学运算: 数学运算中:只有纯字符串.布尔值.null能够进行隐式转换.   //隐 ...

  10. MySQL存储过程(PROCEDURE)(一)

    一.定义与目的: 定义:存储过程是数据库 SQL 语言层面的代码封装与重用(是数据库中存储复杂程序,以便外部程序调用的一种数据库对象): 目的:我们为了完成特定功能的SQL语句集,经编译创建并保存在数 ...