我有一个仅在横向模式下运行的 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?
请帮忙!- 西雅图夜未眠