Samsung S8などの一部のデバイスでは、ナビゲーションバーを表示または非表示にすることができます。これは、状況によっては問題になります。 Samsung S8のナビゲーションバーは、左下のボタンをクリックして表示または非表示にできます
Androidソースコードであっても、判断するための簡単な方法が見つかりませんでした。
そして、私は次のようないくつかの問題をグーグルで検索します ナビゲーションバーをチェックするための良い解決策 、しかしそれは役に立ちません。
どんな助けでも大歓迎です。
まず、元の作者のクレジット: 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;
}