适配Android 华为等底部虚拟键
在app开发中有很多项目使用底部tab+ ViewPager + fragment 的框架,那么这个时候如果app安装在底部带有虚拟键的设备上的话,会产生设备底部的虚拟键遮挡app底部tab的情况,这个时候对app的外观和功能的使用都产生了很大的影响,下边我们对此情况进行适配。
1、首先我们进行工具类的封装,主要思路是addOnGlobalLayoutListener全局监听视图的变化(onGlobalLayoutListener是viewTreeObserver的内部类,当视图变化时onGlobalLayoutListener可以监听到),那么当视图的高度发生变化时,就对这个视图重新布局,使视图不被遮挡。
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;import java.lang.reflect.Method;public class NavigationBarUtil {public static void initActivity(View content) {new NavigationBarUtil(content);}private View mObserved;//被监听的视图private int usableHeightView;//视图变化前的可用高度private ViewGroup.LayoutParams layoutParams;private NavigationBarUtil(View content) {mObserved = content;//给View添加全局的布局监听器监听视图的变化mObserved.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {public void onGlobalLayout() {resetViewHeight();}});layoutParams = mObserved.getLayoutParams();}/*** 重置视图的高度,使不被底部虚拟键遮挡*/private void resetViewHeight() {int usableHeightViewNow = CalculateAvailableHeight();//比较布局变化前后的View的可用高度if (usableHeightViewNow != usableHeightView) {//如果两次高度不一致//将当前的View的可用高度设置成View的实际高度layoutParams.height = usableHeightViewNow;mObserved.requestLayout();//请求重新布局usableHeightView = usableHeightViewNow;}}/*** 计算试图高度* @return*/private int CalculateAvailableHeight() {Rect r = new Rect();mObserved.getWindowVisibleDisplayFrame(r);return (r.bottom - r.top);//如果不是沉浸状态栏,需要减去顶部高度
// return (r.bottom );//如果是沉浸状态栏}/*** 判断底部是否有虚拟键* @param context* @return*/public static boolean hasNavigationBar(Context context) {boolean hasNavigationBar = false;Resources rs = context.getResources();int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");if (id > 0) {hasNavigationBar = rs.getBoolean(id);}try {Class systemPropertiesClass = Class.forName("android.os.SystemProperties");Method m = systemPropertiesClass.getMethod("get", String.class);String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");if ("1".equals(navBarOverride)) {hasNavigationBar = false;} else if ("0".equals(navBarOverride)) {hasNavigationBar = true;}} catch (Exception e) {}return hasNavigationBar;}}
2、在需要适配的activity 的 onCreate方法中的 super.onCreate(savedInstanceState)之后 调用
if(NavigationBarUtil.hasNavigationBar(this)){NavigationBarUtil.initActivity(findViewById(android.R.id.content));}
(推荐封装base 这样就可以直接继承base就可以)。
最后的效果就是app底部tab 在设备的虚拟键之上。
适配Android 华为等底部虚拟键相关推荐
- android华为隐藏底部虚拟按键,沉浸式状态栏/华为虚拟按键隐藏
19版本以上Android可以自己实现沉浸式状态栏的设置 1.创建values-v21文件夹(为了匹配低版本) 在style文件中设置: 设置了这两个属性状态栏就能设置为透明的.但是需要注意的是,这个 ...
- android自动隐藏虚拟键,Android 隐藏底部虚拟键的两种方法
方法一 滑动屏幕 可重新显示出来 protected void hideBottomUIMenu() { //隐藏虚拟按键,并且全屏 if (Build.VERSION.SDK_INT > 1 ...
- android+4.4.2+隐藏虚拟按钮,Android 4.4.2 横屏应用隐藏状态栏和底部虚拟键的方法...
//去title requestWindowFeature(Window.FEATURE_NO_TITLE); //隐藏状态栏 getWindow().setFlags(WindowManager.L ...
- android 隐藏手机底部虚拟按键
今天,简单讲讲android如何隐藏手机下面的虚拟按键. 其实,自己在做界面适配时,老是发现了华为手机存在适配的问题,主要就是华为手机有一个底部的虚拟按键占用了界面的部分空间,所以在网上搜索了如何隐藏 ...
- Android如何隐藏底部虚拟按键
虚拟按键隐藏 相信大家在做屏幕适配时候,会对虚拟按键问题或多或少有一些疑问,接下来带给大家解决虚拟按键的方法. android隐藏底部虚拟键Navigation Bar实现全屏 安卓4.1之后为全虚拟 ...
- 【Android】隐藏底部虚拟按键,亲测可用
Google的官方文档是: https://developer.android.com/training/system-ui/navigation.html#behind 示例代码 View deco ...
- 【Android】隐藏底部虚拟按键
Google的官方文档是: https://developer.android.com/training/system-ui/navigation.html#behind 示例代码 1 View de ...
- android 隐藏导航栏 虚拟键
感谢作者:https://juejin.im/post/5d5ce681e51d45620821cec6 1.首先设置全屏显示 2.然后全屏并隐藏虚拟导航栏.设置导航栏状态监听,避免点击一下后导航栏又 ...
- java 隐藏虚拟键_Android 对底部虚拟键的显示和隐藏
场景:播放全屏视频或则游戏界面会隐藏虚拟按键,其他界面会显示虚拟按键. 1.隐藏底部虚拟按钮: /** * 隐藏虚拟按键 */ public void goneSystemUi(){ //隐藏虚拟按键 ...
最新文章
- 【算法】Tween算法
- 基于OpencvTensorflow实现实时查找停车位置
- 2019年Vue学习路线图
- Bash数组操作教程
- mysql 唯一约束 多字段_mysql多字段唯一约束
- Nacos集群部署说明
- sql int 比较_分享 21 个编写 SQL 的好习惯
- Android开发笔记(一百一十)使用http框架上传文件
- 开源如何走向商业化?
- OpenCV读取一张图片,并将其转换为灰度图像显示
- APS计划排程和生产排产系统,包含哪些排程算法?
- python爬虫 - 爬取堆糖图片
- java虚拟机扫盲文
- 基于LMS算法的DFE判决反馈均衡器
- Python爬虫:使用线程池快速下载视频
- android按住录音按钮_Android模仿微信录音、发送语音效果实现
- EndnoteX9下载及教程
- 小米 红米版note 4x刷机成功
- sql语句中where 1=1的作用
- java vector的排序_java Vector排序及用法