【问题标题】:Android UI alignment issues when supporting kitkat支持 kitkat 时的 Android UI 对齐问题
【发布时间】:2014-09-12 14:41:23
【问题描述】:

过去两周,我一直在努力寻找可靠的解决方案来解决问题。 在我们的 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 xhdpi 索尼 xperia sl 中,没有导航栏完美地选择布局,但在索尼 xperia m2 中,即使它有导航栏并且没有硬件菜单按钮,也将 hasBackKey 返回为 true,并选择up 没有导航栏的布局,布局看起来很丑。甚至尝试了更多的东西,比如导航栏的资源 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 在不同的设备中对齐。

请帮我找到解决办法。

【问题讨论】:

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


    【解决方案1】:

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

    使用以下方法也可以得到屏幕的显示尺寸

    DisplayMetrics displayMetrics = new DisplayMetrics();
            d.getMetrics(displayMetrics);
    
            int displayHeight = displayMetrics.heightPixels;
            int displayWidth = displayMetrics.widthPixels;
    

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

    【讨论】:

      猜你喜欢
      • 2020-07-13
      • 2016-02-11
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      相关资源
      最近更新 更多