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

  第一部分

    清单文件中组件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. sklearn_随机森林random forest原理_乳腺癌分类器建模(推荐AAA)

     sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  2. 神经网络1_neuron network原理_python sklearn建模乳腺癌细胞分类器(推荐AAA)

    sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...

  3. Kubernetes之canal的网络策略(NetworkPolicy)

    安装要求: 1.我们这里安装的是3.3的版本.kubernetes的要求: 支持的版本 1.10 1.11 1.12 2.CNI插件需要启用,Calico安装为CNI插件.必须通过传递--networ ...

  4. .net core引用错误的Entity Framework而导致不能正常迁移数据的解决办法

    本人刚学.net core,因此在学习过程中会遇上许许多多的坑.每一位初学者最大的问题在于资料的查看不仔细或是没有正确理解里面的内容,导致在后面自己在不知道错误的情况下做了一个小动作.对于完全没有理解 ...

  5. Linux-Shell编程之数组操作

    源码 #!/bin/bash str="Array - Demo Shell"; echo ${#str} #求字符串長度 #定義 arr=('a' 'b' 'c' 'd' 'e' ...

  6. 读spring源码(一)-ClassPathXmlApplicationContext-初始化

    工作来几乎所有的项目都用到了spring,却一直没有系统的读下源码,从头开始系统的读下吧,分章也不那么明确,读到哪里记到哪里,仅仅作为个笔记吧. 先看ClassPathXmlApplicationCo ...

  7. git知识总结-4.git服务器搭建及迁移git仓库

    1. 前言 因为手里有一份代码之前是直接从其它git服务器上克隆下来的,现在想自己搭建一个git服务器把这份代码管起来. 2. 搭建git服务器 1.安装git: $ sudo apt-get ins ...

  8. 项目Alpha冲刺(团队)-第五天冲刺

    格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队)-代码规范.冲刺任务与计划 团队名称:为了交项目干杯 作业目标:描述第五天冲刺的项目进展.问题困难.心得体会 ...

  9. 【转】让EntityManager的Query返回Map对象

    在JPA 2.0中我们可以使用entityManager.createNativeQuery()来执行原生的SQL语句.但当我们查询结果没有对应实体类时,需使用entityManager.create ...

  10. 小程序:navigateBack()修改数据

    1.获取当前页面js里面的pages里的所有信息var pages = getCurrentPages(); 2. -2上一个页面    -3是上上个页面 var prevPage = pages[p ...