支持kitkat时,Android UI对齐问题

时间:2014-09-10 05:03:59

标签: android android-layout user-interface android-ui navigationbar

过去两周,我一直在努力寻找解决问题的可靠解决方案。 在我们的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);
            }

但我又没有运气。 在sony xperia sl是4.1.2版本的android,xhdpi,没有导航栏完美地选择布局,但是在sony xperia m2中,即使它有一个导航栏并且没有硬件菜单按钮,也会将hasBackKey返回为true,并选择布局没有导航栏,布局看起来很难看。甚至尝试过更多的东西,比如导航栏的资源ID,但是在htc中有硬件按钮而没有导航栏,有一个导航栏的资源ID。所以它不起作用。我得到了资源ID,如下所示。

int resourceId = resources.getIdentifier("navigation_bar_height",
                "dimen", "android");

有人有这个问题吗? 我做任何傻事或遗失任何事情吗?

我在找什么?

1)我的应用程序应该从4.0到最新版本。

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

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

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

注意:应用仅处于横向模式。甚至尝试过透明的导航栏主题,但它们仅在kitkat中受支持。我正在使用values-hdpi,values-xhdpi等,以便在不同设备中对齐UI。

请帮我找一个解决方案。

1 个答案:

答案 0 :(得分:0)

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

使用以下

获得屏幕的显示尺寸
DisplayMetrics displayMetrics = new DisplayMetrics();
        d.getMetrics(displayMetrics);

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

如果实际宽度和显示宽度相同,则表示设备没有导航栏,否则设备有导航栏。因此,我正在设置适当的布局。我只关注宽度,因为我的应用程序仅在横向模式下运行。