关于华为虚拟键解决办法

1.判断是否有虚拟键

2.监听视图高度变化

3.判断是否为沉浸式

4.关键代码:

package com.dg.compass.utils;

package com.dg.compass.utils;

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;

 

    }

 

}
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;

 

    }

 

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值