NavUtils底部虚拟导航栏工具类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NavUtils底部虚拟导航栏工具类相关的知识,希望对你有一定的参考价值。

版权声明:本文为博主原创文章,未经博主允许不得转载。

前言

获取底部虚拟导航栏的高度值

效果图

技术分享

代码分析

checkDeviceHasNavigationBar(Context context): 检测是否存在底部虚拟导航栏

getNavigationBarHeight(Context activity): 获取底部虚拟导航栏高度

使用步骤

一、项目组织结构图

技术分享

注意事项:

1、导入类文件后需要change包名以及重新import R文件路径

2、Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

将NavUtils复制到项目中

package com.why.project.navutilsdemo.utils;

import android.content.Context;
import android.content.res.Resources;

import java.lang.reflect.Method;

/**
 * Created by HaiyuKing
 * Used 底部虚拟导航栏工具类
 */

public class NavUtils {
    private NavUtils() {
        throw new RuntimeException("NavUtils cannot be initialized!");
    }

    /**
     * 获取底部虚拟导航栏高度
     * @param activity
     * @return
     */
    public static int getNavigationBarHeight(Context activity) {
        if (!checkDeviceHasNavigationBar(activity)) {
            return 0;
        }
        Resources resources = activity.getResources();
        int resourceId = resources.getIdentifier("navigation_bar_height",
                "dimen", "android");
        //获取NavigationBar的高度
        int height = resources.getDimensionPixelSize(resourceId);
        return height;
    }

    /**
     * 检测是否有底部虚拟导航栏
     * @param context
     * @return
     */
    public static boolean checkDeviceHasNavigationBar(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;

    }
} 

三、使用方法

package com.why.project.navutilsdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import com.why.project.navutilsdemo.utils.NavUtils;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private TextView tv_show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_show = (TextView) findViewById(R.id.tv_show);

        int navigationBarHeight = NavUtils.getNavigationBarHeight(this);
        tv_show.setText("底部虚拟导航栏高度值为:"+navigationBarHeight + ",单位为px");
    }
}

混淆配置

参考资料

暂时空缺

项目demo下载地址

https://github.com/haiyuKing/NavUtilsDemo

以上是关于NavUtils底部虚拟导航栏工具类的主要内容,如果未能解决你的问题,请参考以下文章

如何使我的片段适合我的工具栏和底部导航栏,并使它仍可滚动?

在底部导航栏中保存片段状态

通过底部导航栏更改片段时恢复片段状态

底部导航片段应用程序不断崩溃

底部导航栏的 Oncreate 视图问题

带有片段和底部导航栏的 Android FloatingActionButton