【问题标题】:Dimension of soft buttons bar软按钮栏尺寸
【发布时间】:2011-12-31 16:13:45
【问题描述】:

有没有办法确定没有硬菜单按钮的设备菜单栏的尺寸(宽度)? (如 archos 设备)。

我需要知道屏幕的可用尺寸...

【问题讨论】:

    标签: android


    【解决方案1】:

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

    getRealMetrics 方法仅适用于 API 17 和 +,但我仅使用我为 API 19+ 上的设备编写的以下方法

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

    在 Nexus 5 和 Nexus 7 2013 上测试。

    【讨论】:

    • 横屏模式似乎返回了错误的结果
    • 横向模式没有任何问题。轮换更改时是否再次调用您的方法?
    • 不,我的意思是在某些情况下,您需要检查宽度差异而不是高度差异。横屏旋转屏幕右侧的软键是什么时候?
    【解决方案2】:

    一个非常晚的答案,但对于遇到此问题的任何人。获得抵消任何软键/导航栏甚至状态栏的可用空间量的简单方法是使用 Apps DecorView 中的 getWindowVisibleDisplayFrame(Rect)。这将加载一个具有实际可用显示尺寸的 Rect 对象。

    由于不能直接获取到 Activiy 的 DecorView 的引用,所以需要首先使用访问器方法 getWindow() 获取 Activity 的窗口。这将返回包含 Activity 和其他屏幕元素的窗口对象。要获取包含 Activity 以及屏幕装饰(即状态栏、导航栏/软按钮栏)的 decorView,请调用访问器方法 getDecorView()。一旦你引用了 DecorView 调用 getWindowVisibleDisplayFrame(Rect) ,你就会有一个加载的 Rect 对象。

    【讨论】:

      【解决方案3】:

      从 Andorid 3.2 开始,系统状态栏的高度不包含在 DisplayMetrics 的高度中,您必须使用未记录的 API(Display.getRawWidth() 和 Display.getRawHeight())来获取物理屏幕的宽度或高度。

      Method mGetRawW = Display.class.getMethod("getRawWidth");
      Method mGetRawH = Display.class.getMethod("getRawHeight");
      
      int nW = (Integer)mGetRawW.invoke(dp);
      int nH = (Integer)mGetRawH.invoke(dp);
      

      更新:对于 API 13-16,您必须使用上面的代码来获得真正的宽度/高度。对于 API 17+,您现在可以使用新的公共 API,Display.getRealSize()

      【讨论】:

      • 什么是 dp in (Integer)mGetRawW.invoke(dp);它会返回包含软菜单的高度。
      • 它给了我一个 NoSuchMethodException 异常。
      • 什么是dp?也找不到这两种方法(NoSuchMethod Exception)
      【解决方案4】:

      对我来说,在 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
      

      }

      【讨论】:

        猜你喜欢
        • 2019-07-08
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 2016-12-29
        • 2016-04-22
        • 1970-01-01
        相关资源
        最近更新 更多