android 键盘遮挡输入框问题回忆

 背景

        刚开始做Android的时候,有一次遇到输入框位于页面底部,弹出的键盘老是遮挡输入框,这就给人一种感觉----不咋舒服。当时,网上百度了一遍,后面终于解决了,由于当时天天加班,没时间写博客,现在把他放出出来,也是总结下多年前的技术。解决方案有以下几种

一、在activity的oncreate方法中setContentView之前加上如下代码

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

二、在AndroidManifest.xml文件中对应的<activity>中加入。

android:windowSoftInputMode="stateVisible|adjustResize"
或
android:windowSoftInputMode="stateHidden|adjustResize"在这设置的值(除"stateUnspecified"和"adjustUnspecified"以外)将覆盖在主题中设置的值各值的含义:【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示【C】stateHidden:用户选择activity时,软键盘总是被隐藏【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的【E】stateVisible:软键盘通常是可见的【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

效果会让屏幕整体上移

三、借用别人的SoftHideKeyBoardUtil工具类

   使用方式,直接在Activity页面的onCreate方法中加入

  SoftHideKeyBoardUtil.assistActivity(this);

 SoftHideKeyBoardUtil工具类代码


/*** android全屏/沉浸式状态栏下,* 键盘挡住输入框解决工具类*/
public class SoftHideKeyBoardUtil {public static void assistActivity(Activity activity) {new SoftHideKeyBoardUtil(activity);}private View mChildOfContent;private int usableHeightPrevious;private FrameLayout.LayoutParams frameLayoutParams;private SoftHideKeyBoardUtil(Activity activity) {//1、找到Activity的最外层布局控件,它其实是一个DecorView,它所用的控件就是FrameLayoutFrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);//2、获取到setContentView放进去的ViewmChildOfContent = content.getChildAt(0);//3、给Activity的xml布局设置View树监听,当布局有变化,如键盘弹出或收起时,都会回调此监听mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {//4、软键盘弹起会使GlobalLayout发生变化public void onGlobalLayout() {//5、当前布局发生变化时,对Activity的xml布局进行重绘possiblyResizeChildOfContent();}});//6、获取到Activity的xml布局的放置参数frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();}// 获取界面可用高度,如果软键盘弹起后,Activity的xml布局可用高度需要减去键盘高度private void possiblyResizeChildOfContent() {//1、获取当前界面可用高度,键盘弹起后,当前界面可用布局会减少键盘的高度int usableHeightNow = computeUsableHeight();//2、如果当前可用高度和原始值不一样if (usableHeightNow != usableHeightPrevious) {//3、获取Activity中xml中布局在当前界面显示的高度int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();//4、Activity中xml布局的高度-当前可用高度int heightDifference = usableHeightSansKeyboard - usableHeightNow;//5、高度差大于屏幕1/4时,说明键盘弹出if (heightDifference > (usableHeightSansKeyboard / 4)) {// 6、键盘弹出了,Activity的xml布局高度应当减去键盘高度frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;} else {//6、键盘收起了,Activity的xml布局高度应当和可用高度一样frameLayoutParams.height = usableHeightSansKeyboard;}//7、 重绘Activity的xml布局mChildOfContent.requestLayout();usableHeightPrevious = usableHeightNow;}}private int computeUsableHeight() {Rect r = new Rect();mChildOfContent.getWindowVisibleDisplayFrame(r);// 全屏模式下:直接返回r.bottom,r.top其实是状态栏的高度return (r.bottom - r.top);}}

四、Layout上面再加一层ScrollView的封装

最终选择第三种方法,完美解决所遇到问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/722863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据技术学习笔记(五)—— MapReduce(2)

目录 1 MapReduce 的数据流1.1 数据流走向1.2 InputFormat 数据输入1.2.1 FileInputFormat 切片源码、机制1.2.2 TextInputFormat 读数据源码、机制1.2.3 CombineTextInputFormat 切片机制 1.3 OutputFormat 数据输出1.3.1 OutputFormat 实现类1.3.2 自定义 OutputFormat 2 Map…

安卓类加载机制

目录 一、ClassLoader介绍二、双亲委托机制三、类的加载过程 一、ClassLoader介绍 任何一个 Java 程序都是由一个或多个 class 文件组成&#xff0c;在程序运行时&#xff0c;需要将 class 文件加载到 JVM 中才可以使用&#xff0c;负责加载这些 class 文件的就是 Java 的类加…

使用API有效率地管理Dynadot域名,进行DNS域名解析

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

如何快速提升算法竞赛水平

学习算法和数据结构&#xff1a;掌握常见的算法和数据结构&#xff0c;如排序算法、树、图等。可以通过参考经典教材、在线教育平台或参加相关课程来学习。 刷题&#xff1a;多进行算法题的练习&#xff0c;可以选择一些经典的OJ&#xff08;Online Judge&#xff09;平台&…

linux 将 api_key设置环境变量里

vi ~/.bashrc在最后添加api_key的环境变量 export GEMINI_API_KEYAIza**********WvpX7FwbdM刷新配置 source ~/.bashrc使用python 读取环境变量 import os gemini_api_key os.getenv(GEMINI_API_KEY) print(gemini_api_key)

目标检测YOLO实战应用案例100讲-【目标检测】基于图像处理的机器人垃圾分拣系统

目录 前言 2 基于深度学习的图像处理模型研究 2.1 引言 2.2 卷积神经网络

LeetCode--代码详解 146.LRU缓存

题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则…

【DevOps云实践】不同Azure Function的类型

【DevOps云实践】不同Azure Function的类型 Azure函数是由Microsoft Azure提供的无服务器计算服务,允许开发人员构建和部署应用程序而不必担心底层基础设施。使用Azure函数,您可以根据不同的触发器执行代码,并支持多种类型的函数以满足不同的用例。在本博客文章中,我们将探…

springboot + jpa + 达梦数据库兼容 Mysql的GenerationType.IDENTITY主键生成策略

导入达梦数据库对hibernate的方言包 <dependency><groupId>com.dameng</groupId><artifactId>DmDialect-for-hibernate5.6</artifactId><version>8.1.2.192</version></dependency>配置文件中添加方言配置和主键生成策略配置…

VBA自适应多种排班计划日期填充

实例需求&#xff1a;某公司有两种不同排班计划 MWF: 周一周三周五-周一周三周五…TTS: 周二周四周六-周二周四周六… 但是数据表中有时会缺少部分日期&#xff0c;为了便于汇总多个部分的数据&#xff0c;现在需要将日期补全&#xff0c;对于补充的日期标记为黄色。 先讨论一…

【Python_Zebra斑马打印机编程学习笔记(六)】基于Fnthex32.dll将文字转换为打印机指令

基于Fnthex32.dll将文字转换为打印机指令 基于Fnthex32.dll将文字转换为打印机指令前言一、Fnthex32.dll二、python 加载 Fnthex32.dll 的方法1、使用 ctypes 加载 dll2、定义 GETFONTHEX 函数的参数类型和返回类型3、准备输入参数4、分配字符缓冲区来接收输出数据5、调用 dll …

Kafka整理-数据的持久性和可靠性

Apache Kafka保证数据的持久性和可靠性主要通过以下几个机制: 1、日志存储: Kafka将所有消息持久化到磁盘。这意味着即使发生系统故障,消息数据也不会丢失。每个消息在被认为已经“提交”(Committed)之前都会被写入磁盘。2、分区复制(Replication): Kafka中的每个分区都…

php-webdriver 通过队列的方式实现工作流

最近需要批量操作某个古老的后台&#xff0c;但是流程非常复杂&#xff0c;通过 php-webdriver/webdriver 写了个基于队列的方式实现工作流&#xff1b; 可以帮你实现web ui 测试&#xff0c; 自动登录站点&#xff0c;自动识别验证码&#xff08;不复杂的那种&#xff09;&am…

第一个 Angular 项目 - 添加路由

第一个 Angular 项目 - 添加路由 前置项目是 第一个 Angular 项目 - 添加服务&#xff0c;之前的切换页面使用的是 ngIf 对渲染的组件进行判断&#xff0c;从而完成渲染。这一步的打算是添加路由&#xff0c;同时添加 edit recipe 的功能(同样通过路由实现) 用到的内容为&…

解决物理机装不上VMnet1和VMnet8的虚拟网卡问题

问题描述&#xff1a; 博主在使用虚拟机时&#xff0c;发现物理机的ping命令连接不上虚拟机&#xff0c;导致xshell软件也连接不上&#xff0c;最后发现问题是更改适配器设置中没有虚拟机的网卡&#xff08;VMnet1和VMnet8&#xff09;&#xff1a; 方法一&#xff1a; 博主搜…

【MySQL】深入解析日志系统:undo log、redo log、bin log

文章目录 前言1、undo log1.1、undo log 是什么1.2、事务回滚 2、redo log2.1、redo log 是什么2.2、redo log 刷盘2.3、redo log 硬盘文件 3、bin log3.1、bin log 是什么3.2、bin log 和 redo log 区别3.3、bin log 刷盘3.4、两阶段提交 前言 MySQL数据库提供了功能强大的日…

LeetCode 1976.到达目的地的方案数:单源最短路的Dijkstra算法

【LetMeFly】1976.到达目的地的方案数&#xff1a;单源最短路的Dijkstra算法 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/ 你在一个城市里&#xff0c;城市由 n 个路口组成&#xff0c;路口编号为 0 到 n - 1 &#xff…

使用vite创建一个vue3项目

创建一个vue3项目 1.使用命令npm create vuelatest来创建一个vue3项目&#xff0c;注意&#xff1a;官网说明了必须node版本是18及以上的&#xff0c;这边需要注意下 2.然后根据提示进入项目目录 先npm install安装依赖&#xff0c;然后npm run dev启动项目 大家可以看到&am…

Windows安装Go语言及VScode配置

最近搞自己的网站时突然想起来很多上学时的事&#xff0c;那会美国总统还是奥巴马&#xff0c;网页课教的是DreamWeaver跟Photoshop&#xff0c;其他语言像PHP、Java8、Python都有学一点&#xff0c;讲究一个所见即所得。虽然是信管专业那时和斌桑班长对新语言很感兴趣&#xf…

分享一个完全免费的GPT4站点,gpts也可以用

给大家分享一个完全免费的GPT4站点&#xff0c;gpts也可以用点击链接可用