【问题标题】:Detect soft navigation bar availability in onePlusOne device progmatically?以编程方式检测一加一设备中软导航栏的可用性?
【发布时间】:2016-06-08 09:54:22
【问题描述】:

我需要检查设备是否有软导航栏,我按照here的建议进行操作。

它很好用,除了在 onePlus 设备上,出于某种原因,这段代码:

int id = resources.getIdentifier("config_showNavigationBar", "bool", android");
    return id > 0 && resources.getBoolean(id);

虽然显示了软导航栏,但返回 false。

知道如何获得正确的结果吗?

我不想计算实际宽度和可用宽度,这似乎是一项昂贵的操作。

谢谢。

【问题讨论】:

  • 你有解决办法吗?
  • 是的。最后,我使用了这段代码: public boolean hasNavBar() { Display d = getWindowManager().getDefaultDisplay(); DisplayMetrics dm = new DisplayMetrics(); d.getRealMetrics(dm); int realHeight = dm.heightPixels; int realWidth = dm.widthPixels; d.getMetrics(dm); int displayHeight = dm.heightPixels; int displayWidth = dm.widthPixels;返回 (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0; } 这在所有设备上给出了最好的结果。

标签: android


【解决方案1】:

请参阅this 答案。但是,没有办法 100% 确定。

boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME);

if (hasBackKey && hasHomeKey) {
    // no navigation bar, unless it is enabled in the settings
} else {
    // 99% sure there's a navigation bar
}

编辑

另一种方法

public boolean hasNavBar (Resources resources) {
    int id = resources.getIdentifier("config_showNavigationBar", "bool", "android");
    return id > 0 && resources.getBoolean(id);
}

【讨论】:

  • 这不适用于 HTC 等具有自定义 ROM 的设备
  • @SureshKumar 查看编辑。这是一个替代解决方案。
  • 在三星 A70 上总是返回 true
【解决方案2】:

是的,你可以试试这个:

    WindowManager mgr = (WindowManager) getSystemService(WINDOW_SERVICE);
            boolean hasSoftKey = Utils.hasSoftKeys(mgr, NPTApplication.this);

public static boolean hasSoftKeys(WindowManager windowManager, Context c) {
        boolean hasSoftwareKeys = true;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            Display d = windowManager.getDefaultDisplay();

            DisplayMetrics realDisplayMetrics = new DisplayMetrics();
            d.getRealMetrics(realDisplayMetrics);

            int realHeight = realDisplayMetrics.heightPixels;
            int realWidth = realDisplayMetrics.widthPixels;

            DisplayMetrics displayMetrics = new DisplayMetrics();
            d.getMetrics(displayMetrics);

            int displayHeight = displayMetrics.heightPixels;
            int displayWidth = displayMetrics.widthPixels;

            hasSoftwareKeys = (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0;
        } else {
            boolean hasMenuKey = ViewConfiguration.get(c).hasPermanentMenuKey();
            boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
            hasSoftwareKeys = !hasMenuKey && !hasBackKey;
        }
        return hasSoftwareKeys;
    }

【讨论】:

    【解决方案3】:

    不行,你必须计算大小

    使用的方法在这个 SO 答案中有详细说明;

    How to get height and width of navigation bar programmatically

    【讨论】:

      【解决方案4】:

      嗯,有一个方法hasPermanentMenuKey 可以检查硬件MenuKey 是否存在,通常三星设备将它放在Home 按钮的左侧大小上。

      所以如果返回true,则表示手机有硬件按键,如果返回false,则表示手机有导航栏。

      方法是:

      ViewConfiguration.hasPermanentMenuKey()
      

      我觉得它对我自己很有用。

      【讨论】:

      • 这不适用于 HTC one 和一加一等设备。这总是返回 true
      【解决方案5】:

      //导航栏隐藏时该方法可以返回0。

      private fun getNavigationBarHeight(context: Context): Int {
          val display = context.windowManager?.defaultDisplay
          return if (display == null) {
              0
          } else {
              val realMetrics = DisplayMetrics()
              display.getRealMetrics(realMetrics)
              val metrics = DisplayMetrics()
              display.getMetrics(metrics)
              realMetrics.heightPixels - metrics.heightPixels
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-13
        • 1970-01-01
        • 2018-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多