1

我有一个仅在横向模式下运行的 Android 4.0 应用程序。在一项活动中,我想根据可用高度呈现不同的 UI。我已经设置了适当的布局限定符目录并且正在选择它们,但不是以预期的方式。

我的文件夹是:

  • 资源/布局
  • res/layout-h360dp

到目前为止,一切都很好。这就是它开始偏离轨道的地方。该应用程序在全屏模式下运行,唯一的 chrome 是带有返回、主页和切换应用程序按钮的栏,在任何情况下都在侧面并且不会影响可用高度。

该应用程序报告有 384dp 的高度可用。我什至在屏幕上放置了一个 383dp 高的垂直条,它可以正确显示,下方有一小块空间。显然有 384dp 可用。

但是应用程序不会使用 res/layout-h360dp 中的文件!我尝试了不同的数字,直到它起作用,我发现截止是 360dp。当我将名称更改为 layout-h359dp 时,它可以工作,所以应用程序认为它只有 359dp 可用,但显然它有更多,这可以通过绘制有空间的垂直条的能力来证明。这是操作系统中的错误吗?

这是我用来以编程方式仔细检查可用空间的代码。

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);

// Reports 1196x768
int width = size.x;
int height = size.y;

// Reports 598x384
float widthDp = MeasuringUtilities.convertPixelsToDp(width, this);
float heightDp = MeasuringUtilities.convertPixelsToDp(height, this);

// WTF? Reports 598x359! Why?!
float resourcesWidth = this.getResources().getConfiguration().screenWidthDp;
float resourcesHeight = this.getResources().getConfiguration().screenHeightDp;

像素到 dp 的转换是通过以下例程进行的:

public static float convertPixelsToDp(float px, Context context){
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float dp = px / (metrics.densityDpi / 160f);
    return dp;
}

事实上,至少 getConfiguration().screenHeightDp 报告了一个似乎正在使用的数字,这让我感到有些安慰。但为什么?实际可见的可用高度是 384。为什么要报告 359?

请帮忙!- 西雅图夜未眠

4

0 回答 0