Android 适配底部返回键等虚拟键盘的完美解决方案
这个问题来来回回困扰了我很久,一直没能妥善解决。
场景1:华为手机遮挡了屏幕底部。
场景2:进入应用时,虚拟键自动缩回,留下空白区域。
需求:
需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占满整个屏幕,当用户启用虚拟键时,应用能往上收缩,等于是被底部虚拟按键顶上来。
需求很简单,实现起来却困难重重。
完美解决方案:
解释一下下面的代码,就是监听某个视图的变化,当可以看见的高度发生变化时,就对这个视图重新布局,保证视图不会被遮挡,也不会浪费屏幕空间。这一点尤其可用在像华为手机等可以隐藏和显示虚拟键盘上导致屏幕变化的手机上。
- 首先添加工具类AndroidBug54971Workaround
package com.xxxx.xxxx;import android.graphics.Rect; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver;/*** Created by win7 on 2016/12/14.*/public class AndroidBug54971Workaround {// For more information, see https://code.google.com/p/android/issues/detail?id=5497// To use this class, simply invoke assistActivity() on an Activity that already has its content view set./*** 关联要监听的视图** @param viewObserving*/public static void assistActivity(View viewObserving) {new AndroidBug54971Workaround(viewObserving);}private View mViewObserved;//被监听的视图private int usableHeightPrevious;//视图变化前的可用高度private ViewGroup.LayoutParams frameLayoutParams;private AndroidBug54971Workaround(View viewObserving) {mViewObserved = viewObserving;//给View添加全局的布局监听器mViewObserved.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {public void onGlobalLayout() {resetLayoutByUsableHeight(computeUsableHeight());}});frameLayoutParams = mViewObserved.getLayoutParams();}private void resetLayoutByUsableHeight(int usableHeightNow) {//比较布局变化前后的View的可用高度if (usableHeightNow != usableHeightPrevious) {//如果两次高度不一致//将当前的View的可用高度设置成View的实际高度frameLayoutParams.height = usableHeightNow;mViewObserved.requestLayout();//请求重新布局usableHeightPrevious = usableHeightNow;}}/*** 计算视图可视高度** @return*/private int computeUsableHeight() {Rect r = new Rect();mViewObserved.getWindowVisibleDisplayFrame(r);return (r.bottom - r.top);} }
- 然后在你需要解决这个问题的Activity的onCreate方法的setContentView(R.layout.content_frame);后面添加上
setContentView(R.layout.content_frame);AndroidBug54971Workaround.assistActivity(findViewById(android.R.id.content));
如果你看的懂代码,你肯定知道assistActivity方法里放入的View是你 要调整高度的视图。
其他不完美方案:或多或少在某些情况上会起不到作用
我一种方法:
android:fitsSystemWindows=”true”
这句话写在layout的根目录下,看名字就知道是自适应系统窗口。估计能解决很大一部分手机了,可是在同事的nexus 4下并没有什么用。
第二种方法:
我去掉了每个布局的android:fitsSystemWindows=”true”
在style文件中添加了这句话。
<item name="android:windowTranslucentNavigation">false</item>
注意: 你会发现系统报错,这是因为这句话是在API-19后才有的,所以你可以复制你的style文件,把它放到API-19的文件夹下。这样的用途就是如果手机大于等于API19,就会用API-19的文件夹下的内容。否则用原来的style文件。你在API19文件夹下的style文件的根主题中添加上面这句话就OK啦。
本来我以为是完美解决了我的问题。可是被打脸了。刚进入App时会出现上面的场景2的情况。
我一看MainActivity中的onCreate方法的setContentView(R.layout.xxxx);之前有下面的代码
//控制底部虚拟键盘 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar // | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar| View.SYSTEM_UI_FLAG_IMMERSIVE);
估计是这个项目以前的仁兄为了解决这个问题添加的。
经过多次调试,我添加了一句话
//控制底部虚拟键盘 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar // | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar| View.SYSTEM_UI_FLAG_IMMERSIVE);getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
场景2的情况解决了。这是在虚拟键一直存在的情况下没有问题了,因为nexus不能手动隐藏虚拟键盘,所以我也不清楚是否能在华为等手机上正常运行。TODO。
另外如果想要一直隐藏虚拟键盘,点击屏幕也不会出现的话,将上面的代码换成:
//让虚拟键盘一直不显示Window window = getWindow();WindowManager.LayoutParams params = window.getAttributes();params.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_IMMERSIVE;window.setAttributes(params);
转载于:https://www.cnblogs.com/zhujiabin/p/9145033.html
Android 适配底部返回键等虚拟键盘的完美解决方案相关推荐
- Android适配底部返回键等虚拟键盘的完美解决方案
这个问题来来回回困扰了我很久,一直没能妥善解决. 场景1:华为手机遮挡了屏幕底部. 场景2:进入应用时,虚拟键自动缩回,留下空白区域. 需求: 需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占 ...
- android底部滑动出现虚拟按键,Android适配底部虚拟按键的方法详解
Android适配底部虚拟按键的方法详解 发布时间:2020-10-09 05:26:12 来源:脚本之家 阅读:171 作者:yuanzhihui123 最近项目进行适配的时候发现部分(如华为手机) ...
- Android监听返回键、Home键+再按一次返回键退出应用
Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME [java] view plaincopy @Override pub ...
- 【Android】模拟返回键、菜单键、Home键
Android 如何模拟返回键.菜单键.主页键? 如果有一个悬浮窗,运行所有程序的时候都能够看到,我希望点击悬浮窗就模拟返回键的功能,不管我现在运行的是什么程序,这个如何实现? 方法一: Runtim ...
- Android适配之水滴屏和虚拟按键
文章目录 水滴屏适配解决方案: 底部虚拟键盘NavigationBar适配方案: 水滴屏适配解决方案: Android: smarxpan/NotchScreenTool: https://githu ...
- 【Android】Android中屏蔽返回键,home键以及其他实体按键
屏蔽键重写activiy的两个方法就行 屏蔽返回键 public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { ...
- $Android连续按返回键两次实现退出程序
思路:重写Activity的onKeyDown方法,判断按键是不是返回键,如果是,则再判断按下的时间和上次按下的时间之间的差值(毫秒数)是不是大于2000,如果不大于,则用finish()方法结束程序 ...
- vivoy9s怎么设置返回键_vivoy9s怎么设置返回键 可以使用虚拟导航键
vivoy9s是支持全面屏手势的,若用户想要返回操作的话,主要看用户选择的手势导航方式,一般来说可以通过上滑返回到手机桌面,当然了,若用户不习惯手势导航,可以设置虚拟导航键,这样的话手机屏幕下方就会出 ...
- 从网页监听Android设备的返回键
最近搞Android项目的时候,遇到一个比较蛋疼的需求,需要从Client App调用系统浏览器打开一个页面,进行杂七杂八的一些交互之后,返回到App.如何打开浏览器和如何返回App这里就不说了,有兴 ...
最新文章
- 自由主义者的周一和周五
- 山东外贸职业学院王彩霞老师网上考试系统及c语言考试题库》,2019年山东外贸职业学院单独招生考试 《语文》考试大纲(夏季高考)...
- linux7 security,SECURITY-centos7下NFS使用与配置
- EL表达式取Map,List值的总结
- 大数据分析技术未来发展会如何
- DRL实战 : 强化学习在广告点击业务中的应用
- html设置背景颜色以及透明度代码,HTML怎么设置背景颜色透明度?
- 威纶和s7200通讯线_威纶触摸屏与西门子S7200通讯实例
- 资源 | 最新版区块链术语表(中英文对照)2019-1.14
- 【元胞自动机】基于元胞自动机模拟社会力因素下的灾害人员疏散应急仿真附matlab代码
- 进程和线程常见的19个问题
- 一次成功——奶香提子酥
- Manjaro 开发环境配置和使用技巧
- 计算机中容量单位B、KB、MB、GB和TB的关系
- 【Scratch二次开发】03-构建桌面应用
- 论文解读9——TabNet: Attentive Interpretable Tabular Learning
- OMAP3630 Linux I2C总线驱动分析(2)
- 大家在人生低谷时有多惨,怎么熬过来的
- DDL、DML介绍及常用语句
- 面试-Java【之】(revers)递归实现字符串倒序排列(详解)
热门文章
- java openoffice 打印_java调用openoffice将office系列文档转换为PDF的示例方法
- 武汉网络推广介绍如何通过简化标题来提升主关键词排名?
- 重要的事情说三遍!网站如何改版才能最大限度降低影响率?
- 企业网络推广专员浅析如何完善网站维护企业网络推广吸引用户浏览
- 浅析企业网站从何开始了解百度蜘蛛?
- 网站关键词优化从这几方面下手效果会更好!
- java分解因式_用JAVA因式分解 并以9=3×3格式输出
- aspose html转pdf_PDF如何转HTML?办公党必备
- mysql多列索引用处_MySQL索引使用说明(单列索引和多列索引)
- 中信建投云计算机系列报告二,【中信建投 通信】云计算系列报告之二:电信与数通共振,光模块迎高景气(更新)...