编辑(2014年9月26日):我重新表述了我的文字,包含完整的答案而不仅仅是对Dmitri解决方案的评论。
这是我们在旋转之前用来计算导航栏高度的部分:
DisplayMetrics metrics = new DisplayMetrics();
mFragment.getActivity().getWindowManager().getDefaultDisplay()
.getMetrics(metrics);
Resources appRes = getResources();
Resources sysRes = Resources.getSystem();
boolean landscapeMode = (metrics.widthPixels > metrics.heightPixels);
boolean hasNavigationBar = !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
int navBarHeight = 0;
int navBarHeightRotated = 0;
if (hasNavigationBar) {
int barHeightDimId = 0;
int barHeightDimIdRotated = 0;
if (landscapeMode) {
barHeightDimId = sysRes.getIdentifier(
"navigation_bar_height_landscape", "dimen", "android");
barHeightDimIdRotated = sysRes.getIdentifier(
"navigation_bar_height", "dimen", "android");
} else {
barHeightDimIdRotated = sysRes.getIdentifier(
"navigation_bar_height_landscape", "dimen", "android");
barHeightDimId = sysRes.getIdentifier("navigation_bar_height",
"dimen", "android");
}
if (barHeightDimId != 0) {
navBarHeight = appRes.getDimensionPixelSize(barHeightDimId);
}
if (barHeightDimIdRotated != 0) {
navBarHeightRotated = appRes
.getDimensionPixelSize(barHeightDimIdRotated);
}
NCLogs.i("MyApp", String.format("Android navigation bar height: %d (current), %d (after rotation)", navBarHeight, navBarHeightRotated));
}
然后,我们可以在旋转后计算我们的视图宽度和高度:
int realScreenHeight = metrics.heightPixels + navBarHeight;
int realScreenWidth = metrics.widthPixels;
/*
* Height of decor views: system status bar + any application addtional elements +
* + system navigation bar
*/
int decorHeightRotated = realScreenHeight - getHeight() - navBarHeight + navBarHeightRotated;
int viewWidthRotated = realScreenHeight;
int viewHeightRotated = (realScreenWidth - decorHeightRotated);
NCLogs.i("MyApp", String.format("Width after rotation: %d, Height after rotation: %d", viewWidthRotated, viewHeightRotated));