支持kitkat时的Android UI对齐问题

支持kitkat时的Android UI对齐问题,android,android-layout,user-interface,android-ui,navigationbar,Android,Android Layout,User Interface,Android Ui,Navigationbar,过去两周来,我一直在努力寻找可靠的解决方案来解决一个问题。 在我们的android应用程序中,我们使用背景图像。在这个图像中有一些边界,我们必须在其中放置不同的视图。 从4.0到当前最新版本,需要支持该应用程序。 下面列出了我面临的问题 当安装在带有导航栏的设备上时,该应用看起来很完美,但在没有导航栏的设备上运行时,对齐会受到干扰 我试了什么? 我试着检查操作系统版本是否为18 4.3,并据此为每个活动创建两个布局并安装。 代码在这里 if (DEVICE_API_VERSION > 17

过去两周来,我一直在努力寻找可靠的解决方案来解决一个问题。 在我们的android应用程序中,我们使用背景图像。在这个图像中有一些边界,我们必须在其中放置不同的视图。 从4.0到当前最新版本,需要支持该应用程序。 下面列出了我面临的问题

当安装在带有导航栏的设备上时,该应用看起来很完美,但在没有导航栏的设备上运行时,对齐会受到干扰

我试了什么? 我试着检查操作系统版本是否为18 4.3,并据此为每个活动创建两个布局并安装。 代码在这里

if (DEVICE_API_VERSION > 17) {
    setContentView(R.layout.layoutwithnavigationbar);
            } else {
    setContentView(R.layout.layoutnonavigationbar);
            }
但也有像三星galaxy note II这样的设备,它们可以升级到4.4.2,并且没有导航栏

然后我尝试了以下步骤

    boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
    boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME);
    boolean hasMenuKey = ViewConfiguration.get(mContext).hasPermanentMenuKey();
    System.out.println("has back key . . . . "+hasBackKey);
    System.out.println("has home key . . . . "+hasHomeKey);
    System.out.println("has menu key . . . . " + hasMenuKey);
            if(hasHomeKey || hasBackKey) {
                setContentView(R.layout.layoutnonavigationbar);
            } else {
                setContentView(R.layout.layoutwithnavigationbar);
            }
但我还是没有运气。 在4.1.2版android的索尼xperia sl中,xhdpi没有导航栏可以完美地选择布局,但在索尼xperia m2中,即使有导航栏并且没有硬件菜单按钮,hasBackKey也会返回true,并且在没有导航栏的情况下选择布局,布局看起来很难看。甚至尝试了更多的东西,比如导航栏的资源id,但在htc one s中,它有硬件按钮,没有导航栏,它有一个导航栏的资源id。所以它不起作用。我得到了如下所示的资源id

int resourceId = resources.getIdentifier("navigation_bar_height",
                "dimen", "android");
有人有这个问题吗? 我是在做傻事还是错过了什么

我在找什么

1我的应用程序应能从4.0版运行到最新版本

2如果任何设备有导航栏,它可以完全透明,也可以使用下面的屏幕,这样UI就不会受到影响,或者其他更好的解决方案也可以

3想知道是否有任何标准方法可以知道设备是否有导航栏或是否使用硬件按钮

4如何在Kitkat之前的设备中使导航栏透明

注意:应用程序仅处于横向模式。甚至尝试了透明的导航栏主题,但它们仅在kitkat中受支持。我使用hdpi、xhdpi、ect等值使UI在不同的设备中对齐


请帮我找到一个解决方案。

经过大量研究,我终于找不到可靠的解决方案。我不知道这是否是标准的做法,但它符合我的目的。我在问题中使用了答案

使用以下命令也可以获得屏幕的显示大小

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

        int displayHeight = displayMetrics.heightPixels;
        int displayWidth = displayMetrics.widthPixels;
若实际宽度和显示宽度相同,则表示设备并没有导航栏,否则设备有导航栏。因此,我正在设置适当的布局。我只关心宽度,因为我的应用程序只在横向模式下运行