在Android上检测软导航栏并隐藏导航栏

时间:2020-03-04 17:47:46

标签: java android android-studio

现在,在任何人将问题标记为重复之前,请仔细阅读该问题。我已经尝试了关于堆栈溢出的每个当前答案。

通常,我想知道如何检测用户设备屏幕底部是否存在任何软导航栏。

现在

1)我看到了一个答案,人们可​​以检查最大屏幕尺寸,查看正在显示哪个应用程序/活动,然后根据结果确定是否没有柔软的导航栏。对于具有缺口的设备,这将是不可靠的。

2)我不希望知道是否有硬件导航栏。软导航栏是必须的,因为:

a。在我的实际设备中,也没有硬件导航栏,也没有软导航栏。如今,有几部手机使用手势进行导航。

b。但是在我的模拟器中,有导航栏。有柔软的导航栏。

要隐藏它们,我使用以下代码:

int uiOptionsForDevicesWithoutNavBar = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_FULLSCREEN
        |  View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptionsForDevicesWithoutNavBar);

现在,这就像一种魅力。 Waalaa,导航栏被隐藏。但是,这是我实际手机上的问题。 它使用手势。在我第一次向后滑动时,会出现通知栏,然后在下次向后快速滑动时,会执行所需的后退操作。

但是,如果我这样做:

int uiOptionsForDevicesWithoutNavBar = View.SYSTEM_UI_FLAG_FULLSCREEN
        |  View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptionsForDevicesWithoutNavBar);

然后它可以在我的物理设备上正常工作,但是导航栏不会隐藏在模拟器上,这很明显,因为隐藏它的主标志不存在。

因此,我想针对不同类型的手机运行不同的标志,具体取决于设备是否具有屏幕上的Soft Nav Bar。

因此,我想知道如何检测屏幕上是否有柔软的导航栏。

此外,如果有更好的方法,请帮助我。

1 个答案:

答案 0 :(得分:0)

public boolean hasNavigationBar(Resources resources) {
        int id = resources.getIdentifier("config_showNavigationBar", "bool", "android");
        return id > 0 && resources.getBoolean(id);
    }

此方法将从Android系统读取config_showNavigationBar布尔值。许多OEM在隐藏或显示导航栏(例如Samsung)时都使用此值。

注意:许多第三方应用程序通过一个棘手的ADB命令隐藏了导航栏,但我仍然没有找到检测此情况的方法,请参阅this question