android适配华为菠菜源码搭建虚拟键

在做菠菜源码搭建 dsluntan.com VX:17061863513横竖屏展示时,发现网上适配虚拟键代码没有做横屏状态下适配,导致横屏状态下,底部虚拟键遮挡了布局内容。

所以横屏状态下也需要适配华为虚拟键。只需要在content布局改变时,同时记录当前可用的视图宽度,重新请求布局即可。下面是代码:

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 {

private static NavigationBarUtil Instance;

public static NavigationBarUtil getInstance() {
    return Instance = new NavigationBarUtil();
}

public void initActivity(View content) {
    mObserved = content;
    //给View添加全局的布局监听器监听视图的变化
    mObserved.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        public void onGlobalLayout() {
            resetViewHeight();
        }
    });
    layoutParams = mObserved.getLayoutParams();
}

private View mObserved;//被监听的视图
private int usableHeightView;//视图变化前的可用高度
private int usableWidthView;//视图变化前的可用宽度
private ViewGroup.LayoutParams layoutParams;

private NavigationBarUtil() {
}

/**
 * 重置视图的高度,使不被底部虚拟键遮挡
 */
private void resetViewHeight() {
    int usableHeightViewNow = CalculateAvailableHeight();
    int usableWidthViewNow = CalculateAvailableWidth();
    //比较布局变化前后的View的可用高度
    if (usableHeightViewNow != usableHeightView) {
        //如果两次高度不一致
        //将当前的View的可用高度设置成View的实际高度
        layoutParams.height = usableHeightViewNow;
        mObserved.requestLayout();//请求重新布局
        usableHeightView = usableHeightViewNow;
    }
    if (usableWidthViewNow != usableWidthView) {
        layoutParams.width = usableWidthViewNow;
        mObserved.requestLayout();//请求重新布局
        usableWidthView = usableWidthViewNow;
    }
}

/**
 * 计算视图的宽度
 * @return
 */
private int CalculateAvailableWidth() {
    Rect r = new Rect();
    mObserved.getWindowVisibleDisplayFrame(r);
    return (r.right);
}

/**
 * 计算视图的高度
 *
 * @return
 */
private int CalculateAvailableHeight() {
    Rect r = new Rect();
    mObserved.getWindowVisibleDisplayFrame(r);

// return (r.bottom - r.top);//如果不是沉浸状态栏,需要减去顶部高度
return (r.bottom);//如果是沉浸状态栏
}

/**
 * 判断底部是否有虚拟键
 *
 * @param context
 * @return
 */
public 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;

}

}
调用方式:在抽取的Activity基类中setContentView()方法后调用

    //适配华为部分机型虚拟键
    if (NavigationBarUtil.getInstance().hasNavigationBar(this)) {
        NavigationBarUtil.getInstance().initActivity(findViewById(android.R.id.content));
    }

原文地址:http://blog.51cto.com/13926356/2160764

时间: 2024-11-05 17:24:18

android适配华为菠菜源码搭建虚拟键的相关文章

Jenkis pipeline构建菠菜源码搭建出售项目实践

在完成前文的jenkins server 在k8s环境部署 之后,本文我们来测试在k8s集群环境中的jenkins pipeline构建项目和更新,具体环境要求如下:1.jenkins pipeline插件安装成功2.要更新的应用已提前部署3.Jenkins slave中需要有kubectl.svn.mvn客户端且环境变量设置准确4.Jenkis slave需要能和master的api-server进行正常通信(这里为了简便,前文构建jenkins server的时候直接对defalut这个se

菠菜源码搭建与微信小程序Demo

demo 的界面设计以及交互设计 工具 菠菜源码搭建QQ:2152876294 网址diguaym.com已经全面对非邀请内测用户开放, 且在持续更新(我码代码的过程中就更新了两版, 所以开发时 IDE 版本不唯一) 不过其实忍受了半个小时微信的开发者工具之后, 我就改在 webstorm 中编辑了, 微信工具成了运行预览的工具, 不过听说IDE 中预览的效果, 也不能保证与真机一样哦~ 设计和功能: 知乎安卓版本 非常之简易版数据: 毕竟是知乎, 为了防止版权问题, fake 的数据使用的是我

菠菜源码搭建与java基础概念

1.java jvm的功能:通过 ClassLoader 寻找和装载 class 文件?? ??? ??? ?? 解释字节码成为指令并执行,提供 class 文件的运行环境?? ??? ??? ?? 进行运行期间垃圾回收 菠菜源码搭建QQ:2152876294 网址diguaym.com?? ??? ??? ?? 提供与硬件交互的平台?? ?2.运算符优先级:单目 >运算>移位>比较>按位>逻辑>三目 >赋值?? ??? ??? ?单目:单目运算符+ –(负数)

菠菜源码下载与优化sql方案

为什么使用索引:1.索引大大减少了存储引擎需要的扫描数据量?2.帮助我们进行排序避免使用的临时表?3.把随机IO变为顺序IO 菠菜源码搭建QQ:2152876294 网址diguaym.com索引是不是越多越好:1.索引增加写入的成本?2.太多索引会增加查询优化器的选择时间索引是在存储引擎层的作用:B-tree索引的特点:1.常见索引,默认的索引,叶子键遍历?2.以B+树的结构存储数据?3.能加快数据的查询速度?4.适合进行范围查找什么情况下可以使用B树索引:1.全值匹配的查询?2.匹配最左前缀

Android 上千实例源码分析以及开源分析

Android 上千实例源码分析以及开源分析(百度云分享) 要下载的直接翻到最后吧,项目实例有点多. 首先 介绍几本书籍(下载包中)吧. 01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 06_Android的GUI系统 07_Android的Audio系统 08_Android的Video 输入输出系统 09_Android的多媒体系统 10_

直播APP源码搭建简易直播平台及个人开发直播系统的难点

如何用直播APP源码搭建一个简易的直播平台 一.前端推流1.推流可以采用命令: ffmpeg -i input -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/cgstream0input 可以是实时流,也可以是文件,如果是文件 需要加上-re.运用中需要将127.0.0.1换成rtmp所在机器的ip地址. 用命令推流时间戳信息不能任意修改,想要达到一个满意的结果还是要用代码实现. 主要方法代码如下: 1.打开视频流,filename

linux下源码搭建php环境之mysql(一)

现在已经大半夜了,五一劳动节挺无聊的. 折腾一下吧,实在是睡不着.于是乎在电脑上安装个虚拟机,然后呢,在虚拟机上搭建一个php环境. 首先我得安装MYSQL吧.发现遇到的问题真多..待我娓娓道来. 主要介绍linux操作系统下MySQL源码进行纯手动安装,如果你对linux操作系统下MySQL源码进行纯手动安装的实际操作流程感兴趣的话,你不妨浏览以下的文章. 1.实现linux下纯手动MySQL源码安装,首先要下载MySQL的源码,我下载的是MySQL-5.0.87.tar.gz 2.解压tar

放大招了!基于Bmob的Android即时通讯应用源码 (一)

今天给大家分享系列干货:基于Bmob的Android即时通讯应用源码.目前Android端已更新到V1.1.1版本.IOS端已推出V1.0.1版本. 以后将持续更新,分享源码!! 脚的好就多多回复 一.已实现功能: 1.支持好友管理功能,包括添加好友.删除好友.获取好友列表,也可以与你已有的用户系统完全解耦: 2.支持的消息类型:纯文本.聊天表情.图片.位置.语音: 3.支持会话的本地化存储: 4.自定义消息处理机制: 5.同一账号多处登陆强制下线: 6.支持消息回执发送:已发送.已阅读两种状态

【转】Ubuntu 14.04.3上配置并成功编译Android 6.0 r1源码

http://www.linuxidc.com/Linux/2016-01/127292.htm 终于成功把Android 6.0 r1源码的源码编译.先上图,这是在Ubuntu中运行的Android模拟器: 由于我是在Win8中安装虚拟机VMware,然后在虚拟机中安装Ubuntu进行编译,所以遇到诸多麻烦.如果直接在Linux中编译,可能会更顺利. ------------------------------------------------------------------------