在三星 S8 等一些设备上,导航栏可以隐藏或显示,这在某些情况下是个问题。 三星S8的导航栏可以通过点击左下角隐藏或显示
即使在 Android 源代码中,我也没有找到直接的方法来确定。
我用谷歌搜索了一些问题,例如A good solution to check for navigation bar ,但没有帮助。
非常感谢任何帮助。
在三星 S8 等一些设备上,导航栏可以隐藏或显示,这在某些情况下是个问题。 三星S8的导航栏可以通过点击左下角隐藏或显示
即使在 Android 源代码中,我也没有找到直接的方法来确定。
我用谷歌搜索了一些问题,例如A good solution to check for navigation bar ,但没有帮助。
非常感谢任何帮助。
首先感谢原作者: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());
}
}
使用这种方法,对我有用。确保首先呈现视图以确保 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;
}