在某些设备上,例如三星S8,导航栏可以隐藏或显示,这在某些情况下是个问题。 Samsung S8's navigation bar can be hide or show by click left bottom button
即使在Android源代码中,我也没有直接判断。
我在谷歌上搜索了一些问题,例如A good solution to check for navigation bar,但它没有帮助。
非常感谢任何帮助。
答案 0 :(得分:3)
对于Samsung手机(例如S8,S9等),您可以通过侦听Samsung事件来检测导航栏是否在显示。
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());
}
}
答案 1 :(得分: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;
}