adjustResize模式下ExpandaleListView中输入框焦点错乱及布局底部的导航栏被顶在键盘上方的处理
为了更好的用户体验,煎熬了许久,得到这么个解决方案。在此记录下来,以供后来者参考。
第一部分
清单文件中组件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中输入框焦点错乱及布局底部的导航栏被顶在键盘上方的处理的更多相关文章
- DEBUG模式下, 内存中的变量地址分析
测试函数的模板实现 /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #defi ...
- NAT模式下VMware中CentOS7无法连接外网的解决方法
故障现象 ----------------------------------------------------------------------------------------------- ...
- 在UWP中页面滑动导航栏置顶
最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...
- 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 ...
- 处理EasyUI中tab的切换问题以及accordion左侧导航栏的代码实现
//左侧导航菜单 function leftMenus() { //$(".easyui-accordion").empty(); $.each(_menus.menus, fun ...
- iOS系统中导航栏的转场解决方案与最佳实践
背景 目前,开源社区和业界内已经存在一些 iOS 导航栏转场的解决方案,但对于历史包袱沉重的美团 App 而言,这些解决方案并不完美.有的方案不能满足复杂的页面跳转场景,有的方案迁移成本较大,为此我们 ...
- SAP CRM 将组件整合至导航栏中
到现在,我们已经可以让组件独立地显示.我们只是运行它.让它显示在Web UI中.让我们把组件整合进导航栏,使我们可以在正常登录Web UI时访问它. 步骤一: 为你的UI组件主窗体创建一个内向插件. ...
- zhuang 定制iOS 7中的导航栏和状态栏
近期,跟大多数开发者一样,我也正忙于对程序进行升级以适配iOS 7.最新的iOS 7外观上有大量的改动.从开发者的角度来看,导航栏和状态栏就发生了明显的变化.状态栏现在是半透明的了,这也就意味着导航栏 ...
- iOS 7 教程:定制iOS 7中的导航栏和状态栏
目录(?)[-] iOS 7中默认的导航栏 设置导航栏的背景颜色 在导航栏中使用背景图片 定制返回按钮的颜 修改导航栏标题的字体 修改导航栏标题为图片 添加多个按钮 修改状态栏的风格 隐藏状态栏 总结 ...
随机推荐
- 深度学习二、CNN(卷积神经网络)概念及理论
一.卷积神经网络(CNN) 1.常见的CNN结构有:LeNet-5.AlexNet.ZFNet.VGGNet.ResNet等.目前效率最高的是ResNet. 2.主要的层次: 数据输入层:Input ...
- react项目后台及上线步骤
应同学要求,本人将react项目创建后台及上线流程书写如下: 前端部分 略…… 后台部分 (注:这里的后台是用的nodejs搭建的,使用的是express框架+ejs模板) 首先通过express快速 ...
- Python认识到放弃
基础入门 计算机硬件基础 变量 数据类型 基本运算符 变量常量 流程控制 数据类型 数字,字符串,列表 元组,字典,集合 字符编码 python2 python3 文件处理 文件读写 指针移动 函数 ...
- Docker实践之01-入门介绍
目录 一.Docker概述 镜像 容器 仓库 二.安装Docker 1.在CentOS上安装Docker 2.在Ubuntu上安装Docker 3.启动docker 4.建立Docker用户组 5.测 ...
- 《11招玩转网络安全》之第三招:Web暴力破解-Low级别
Docker中启动LocalDVWA容器,准备DVWA环境.在浏览器地址栏输入http://127.0.0.1,中打开DVWA靶机.自动跳转到了http://127.0.0.1/login.php登录 ...
- json 格式化的时候,日期格式化
public class CustomIsoDateTimeConverter : IsoDateTimeConverter { public CustomIsoDateTimeConverter() ...
- 好奇,项目根目录下的.editorconfig文件
一..editorconfig文件是什么? 在项目里,大多时候都能看到.editorconfig文件,刚开始总是忽视掉它,认为它不太重要.但是,它的存在,必定有它的理由,于是,抽空来研究一下,它是什么 ...
- PHP 【六】
命名空间 教学网站的内容不知道再怎么“笔记化”,用之即可 面向对象 类定义 创建对象 $xxx = new 类名: 调用成员方法 $xxx->方法名(参数): 举例: <?php cl ...
- docker保存日志文件到本地
其实很简单 docker logs +你需要添加的额外参数 + 容器id >文件名称 然后查看这个文件就可以了,也可以通过ftp协议下载到本地
- The base and high address of the custom IP are not correctly reflected in xparameters.h in SDK
This issue has been observed in 2015.3, 2015.4, and 2015.4.1 builds of Vivado. When you create and a ...