15

在三星 S8 等一些设备上,导航栏可以隐藏或显示,这在某些情况下是个问题。 三星S8的导航栏可以通过点击左下角隐藏或显示

即使在 Android 源代码中,我也没有找到直接的方法来确定。

我用谷歌搜索了一些问题,例如A good solution to check for navigation bar ,但没有帮助。

非常感谢任何帮助。

4

2 回答 2

5

首先感谢原作者:https ://www.jianshu.com/p/ddfbabd614b6

对于三星手机(即 S8、S9 等),您可以通过收听三星事件来检测导航栏是否正在显示。

private static final String SAMSUNG_NAVIGATION_EVENT = "navigationbar_hide_bar_enabled";

然后只听这个事件,做你的事:

private void checkNavigationBar() {
    if (isSamsungVersionNougat()) { // check if Samsung phones
        // detect navigation bar
        try {
            // there are navigation bar
            if (Settings.Global.getInt(activity.getContentResolver(), SAMSUNG_NAVIGATION_EVENT) == 0) {
                // Your code
                // example: galleryViewModel.navigationBarHeight.set(getNavigationBarHeight());
            } else { // there are no navigation bar
                // Your code
                // example: galleryViewModel.navigationBarHeight.set(0);
            }
        } catch (Exception ignored) {
        }
        barHideEnableObserver = new BarHideEnableObserver(new Handler());
        activity.getContentResolver().registerContentObserver(
                Settings.Global.getUriFor(SAMSUNG_NAVIGATION_EVENT),
                true, barHideEnableObserver);
    } else {
        galleryViewModel.navigationBarHeight.set(getNavigationBarHeight());
    }
}
于 2018-12-13T17:26:42.710 回答
0

使用这种方法,对我有用。确保首先呈现视图以确保 getHeight() 不返回 0。还要确保您使用的 rootView 是为了占据整个屏幕。

public static boolean hasNavBar (Activity activity, View rootView) {
    if (activity == null || rootView == null)
        return true;

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1)
        return true;

    Display d = activity.getWindowManager().getDefaultDisplay();
    DisplayMetrics realDisplayMetrics = new DisplayMetrics();
    d.getRealMetrics(realDisplayMetrics);

    int viewHeight = rootView.getHeight();
    if (viewHeight == 0)
        return true;

    int realHeight = realDisplayMetrics.heightPixels;
    return realHeight != viewHeight;
}
于 2017-11-16T19:23:33.937 回答