Galaxy S8:屏幕高度返回错误值

时间:2017-12-06 20:20:02

标签: android

这就是我们获取屏幕高度的方式:

getResources().getDisplayMetrics().heightPixels;

我们遇到的问题是,使用Galaxy S8隐藏的导航栏,返回的值是高度减去导航栏大小(即使导航栏被用户隐藏)。我们如何获得完全可用的高度?

示例:屏幕高度为2220像素,但返回的值为2076

答案需要能够在Galaxy S8上工作,无论是否隐藏导航栏以及其他设备

提前非常感谢

2 个答案:

答案 0 :(得分:1)

尝试使用它:

Point displaySize = new Point();
activity.getWindowManager().getDefaultDisplay().getRealSize(displaySize);

是来自android.graphics 包的类。

来自文档:https://developer.android.com/reference/android/view/Display.html#getRealSize(android.graphics.Point)

  

获取显示的实际大小而不减去任何窗口装饰   或应用任何兼容性比例因子。

     

根据显示器的当前旋转调整尺寸。

     

实际尺寸可能小于屏幕的物理尺寸   窗口管理器正在模拟一个较小的显示器(使用adb shell wm   尺寸)。

编辑:

我在LG G4上检查了这段代码并且工作正常:

//get the full height of device
      Point displaySize = new Point();
      getWindowManager().getDefaultDisplay().getRealSize(displaySize);

      Resources resources = getResources();
            int navBarId = resources.getIdentifier("navigation_bar_height", "dimen", "android");


          int fullHeight = displaySize.y;
//get nav bar size
          int navbarSize = resources.getDimensionPixelSize(navBarId);
          int availableSize = fullHeight;
//check is navbar is visible
          boolean navBarVisible = (getWindow().getDecorView().getSystemUiVisibility() &
                        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;
          if(navBarVisible){
                    availableSize -= navbarSize;
                }

您也可以使用此代码:

view.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
            @Override
            public void onSystemUiVisibilityChange(int i) {
                Log.d("Nav bar visible : ", String.valueOf((i & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)==0));
            }
        });

检查导航栏何时隐藏。

答案 1 :(得分:0)

我遇到了同样的问题,可以用装饰视图解决这个问题:

//Get the correct screen size even if the device has a hideable navigation bar (e.g. the Samsung Galaxy S8)
View decorView = getWindow().getDecorView(); //if you use this in a fragment, use getActivity before getWindow()
Rect r = new Rect();
decorView.getWindowVisibleDisplayFrame(r);
int screenHeight = r.bottom; // =2220 on S8 with hidden NavBar and =2076 with enabled NavBar
int screenWidth = r.right; // =1080 on S8