Android技术我爱编程

Android另类判断NavigationBar虚拟导航栏状态

2018-05-25  本文已影响1159人  孤诣

好久没码字了,所以出来冒个泡

一直用着华为的手机,从一开始就觉得华为的虚拟导航栏用着还是挺顺手的,后来发现越来越多的机子都开始使用起来,查看源码发现,虚拟导航栏是属于SystemUI的一部分。

再一看手机,还提供了隐藏虚拟按键的按钮,于是就想,能不能有一个方法判断导航栏是否显示?基于不重复造轮子的思想,先是网上搜索了一把,方法都大同小异,但一用,发现挺多新手机都无法适配,于是从另一种方向思考如何判断NavigationBar虚拟导航栏是否显示?

思考:从DecorView这个神View入手,因为考虑到我们码的代码基本都在DecorView中一个id为android.R.id.content的容器中,那好,就根据content的容器宽高判断虚拟导航栏是否显示,于是就有了下面的代码。

package com.lkuan.gek.util;

import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.view.Display;
import android.view.View;
import android.view.Window;

/**
 * @author lkuan
 * Create on 2018/5/25
 */
public class NavigationBarUtil {

    /**
     * 判断虚拟导航栏是否显示
     *
     * @param context 上下文对象
     * @param window  当前窗口
     * @return true(显示虚拟导航栏),false(不显示或不支持虚拟导航栏)
     */
    public static boolean checkNavigationBarShow(@NonNull Context context, @NonNull Window window) {
        boolean show;
        Display display = window.getWindowManager().getDefaultDisplay();
        Point point = new Point();
        display.getRealSize(point);

        View decorView = window.getDecorView();
        Configuration conf = context.getResources().getConfiguration();
        if (Configuration.ORIENTATION_LANDSCAPE == conf.orientation) {
            View contentView = decorView.findViewById(android.R.id.content);
            show = (point.x != contentView.getWidth());
        } else {
            Rect rect = new Rect();
            decorView.getWindowVisibleDisplayFrame(rect);
            show = (rect.bottom != point.y);
        }
        return show;
    }
}

经测试,手上大部分手机都能正确得到结果,支持无虚拟按键的判断。

手机码字挺不容易的
附上一个民咕噜的表情包娱乐一下_

Android另类判断NavigationBar虚拟导航栏状态
上一篇下一篇

猜你喜欢

热点阅读