【问题标题】:How Get height of the Status Bar and Soft Key Buttons Bar?如何获取状态栏和软键按钮栏的高度?
【发布时间】:2015-06-06 13:55:46
【问题描述】:

在 Android 中有没有办法让软按钮栏和状态栏的大小一致?或者在没有这两个栏的高度的情况下获得屏幕高度的方法? (它们并不总是相同的,以 nexus 7 为例)

【问题讨论】:

    标签: android statusbar softkeys


    【解决方案1】:

    状态栏的高度

    状态栏的高度取决于屏幕尺寸,例如在具有 240 X 320 屏幕尺寸的设备中,状态栏高度为 20px,对于设备对于 320 X 480 屏幕尺寸,状态栏高度为 25px,对于 480 x 800 的设备,状态栏高度必须为 38px

    所以我推荐使用这个脚本来获取状态栏高度

    Rect rectangle = new Rect();
    Window window = getWindow();
    window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
    int statusBarHeight = rectangle.top;
    int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
    int titleBarHeight= contentViewTop - statusBarHeight;
    
    Log.i("*** Value :: ", "StatusBar Height= " + statusBarHeight + " , TitleBar Height = " + titleBarHeight); 
    

    要在你的Activity的onCreate()方法上获取状态栏的高度,使用这个方法:

    public int getStatusBarHeight() { 
          int result = 0;
          int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
          if (resourceId > 0) {
              result = getResources().getDimensionPixelSize(resourceId);
          } 
          return result;
    } 
    

    软键按钮栏

    此方法对于在 Android KitKat (4.4) 中设置布局填充非常有用。使用它,您可以避免软按钮栏在您的布局上重叠。

    getRealMetrics 方法仅适用于 API 17 和 +

    @SuppressLint("NewApi")
    private int getSoftButtonsBarHeight() {
        // getRealMetrics is only available with API 17 and +
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
            int usableHeight = metrics.heightPixels;
            getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
            int realHeight = metrics.heightPixels;
            if (realHeight > usableHeight)
                return realHeight - usableHeight;
            else
                return 0;
        }
        return 0;
    }
    

    参考:

    Height of status bar in Android

    Dimension of soft buttons bar

    【讨论】:

    • 非常感谢您的回答。我认为如果您同时拥有状态栏和软按钮栏,第二种方法将不起作用,我猜我错了,我已经对此进行了测试并且它有效。 :D 更好的是,它也可以使用 API 16!
    • statusbar是软按钮栏的时候只有一个问题,第一种方法返回25像素,softbuttons方法返回48像素(sony xperia tablet s)
    • @Joske369 阅读参考中的链接,你可以找到其他代码
    【解决方案2】:

    对我来说,在 android note 10 中,我需要按尺寸获取导航栏高度:

    fun getSoftNavigationBarSize(resources: Resources): Int {
        var result = 0
        val resourceId: Int = resources.getIdentifier("navigation_bar_height", "dimen", "android")
        if (resourceId > 0) {
            result = resources.getDimensionPixelSize(resourceId)
        }
        return result
    }
    

    【讨论】:

      【解决方案3】:

      我知道这个问题已经得到解答,但我只是发现这个解决方案似乎比其他解决方案更容易。我只尝试了底部按钮栏。不过,我很确定它对状态栏的工作方式相同。

      view.rootWindowInsets?.let { inset ->
          Log.e("XXX", "button bar height: ${inset.systemWindowInsetBottom}")
      }
      

      注意:此时您需要一个附加到窗口的视图。

      【讨论】:

        【解决方案4】:
         private void getStatusAndNavigationBarsHeight() {
                float deviceDensity = getResources().getDisplayMetrics().density;
                float statusHeight = 0;
                float navigationHeight = 0;
                Resources myResources = getApplicationContext().getResources();
        
                int idStatusBarHeight = myResources.getIdentifier( "status_bar_height", "dimen", "android");
                statusHeight = idStatusBarHeight > 0 ? getResources().getDimensionPixelSize(idStatusBarHeight)/deviceDensity : 0;
                statusHeight = Math.round(statusHeight);
                Log.d("StatusBar Height(dp):", String.valueOf(statusHeight));
        
                int idNavigationBarHeight = myResources.getIdentifier("navigation_bar_height", "dimen", "android");
                navigationHeight = idNavigationBarHeight > 0 ? getResources().getDimensionPixelSize(idNavigationBarHeight)/deviceDensity : 0;
                navigationHeight = Math.round(navigationHeight);
                Log.d("Navigation Bar Height(dp):", String.valueOf(navigationHeight));
            }
        

        【讨论】:

        • 状态栏高度(dp):33 导航栏高度(dp):48
        • statusHeight = idStatusBarHeight > 0 ? getResources().getDimensionPixelSize(idStatusBarHeight)/deviceDensity : 0;导航高度 = idNavigationBarHeight > 0 ? getResources().getDimensionPixelSize(idNavigationBarHeight)/deviceDensity : 0;
        • 这里我们除以 deviceDensity,因此返回的值看起来更真实。
        猜你喜欢
        • 1970-01-01
        • 2013-12-15
        • 2011-04-22
        • 1970-01-01
        • 2018-06-24
        • 1970-01-01
        • 2018-08-16
        • 1970-01-01
        • 2019-11-23
        相关资源
        最近更新 更多