如何在Android中获得可用的屏幕高度?我需要高度减去状态栏/菜单栏或可能在屏幕上的任何其他装饰,我需要它适用于所有设备。另外,我需要在onCreate函数中知道这一点。我知道之前已经问过这个问题,但我已经尝试过他们的解决方案而且没有一个能够工作。以下是我尝试过的一些事情:
我已经在API 7-17上测试了这段代码。不幸的是,在API 13上,水平和垂直底部都有额外的空间,而在API 10,8和7上,水平和垂直底部都没有足够的空间。 (我没有测试过时的API):
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
TypedValue tv = new TypedValue();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
screenHeight -= TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
screenHeight -= getResources().getDimensionPixelSize(resourceId);
这不考虑状态栏/菜单栏:
Display display = getWindowManager().getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();
这两个都没有:
Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
screenWidth = size.x;
screenHeight = size.y;
也不是这样:
Point size = new Point();
getWindowManager().getDefaultDisplay().getRealSize(size);
screenWidth = size.x;
screenHeight = size.y;
这不起作用:
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
// since SDK_INT = 1;
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
try
{
// used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
screenWidth = (Integer) Display.class.getMethod("getRawWidth").invoke(display);
screenHeight = (Integer) Display.class.getMethod("getRawHeight").invoke(display);
}
catch (Exception ignored)
{
// Do nothing
}
try
{
// used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)
Point realSize = new Point();
Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize);
screenWidth = realSize.x;
screenHeight = realSize.y;
}
catch (Exception ignored)
{
// Do nothing
}
然后,我使用以下代码从屏幕高度中减去状态栏和菜单栏的高度:
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
result = getResources().getDimensionPixelSize(resourceId);
screenHeight -= result;
result = 0;
if (screenHeight >= screenWidth)
resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
else
resourceId = getResources().getIdentifier("navigation_bar_height_landscape", "dimen", "android");
if (resourceId > 0)
result = getResources().getDimensionPixelSize(resourceId);
screenHeight -= result;
在API 17上,它正确地以纵向方式计算状态栏和菜单栏的高度,但不以横向方式计算。在API 10上,它返回0.我需要它在所有设备或最小API 7上理想地工作。
答案 0 :(得分:6)
如果您想要显示尺寸(以像素为单位),可以使用getSize:
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
如果您不在Activity
,则可以通过WINDOW_SERVICE
获取默认展示位置:
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
display.getSize(size);
int width = size.x;
int height = size.y;
在引入getSize
之前(在API级别13中),您可以使用现已弃用的 getWidth和getHeight方法:
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth(); // deprecated
int height = display.getHeight(); // deprecated
答案 1 :(得分:5)
工作解决方案:
创建两个虚拟视图:
<View
android:id="@+id/top"
android:layout_height="0dp"
android:layout_width="match_parent"
android:layout_alignParentTop="true" />
<View
android:id="@+id/bottom"
android:layout_height="0dp"
android:layout_width="match_parent"
android:layout_alignParentBottom="true" />
现在,您应该在这两个视图上调用getLocationOnScreen(int [])
来接收他们的位置。此函数返回2个整数的数组。第一个是x,第二个是y。我们只需要y。另请注意,仅在创建所有视图并退出onCreate
方法后才返回正确的值。
我在一个从viewpager调用的常规片段上测试了这段代码。
代码位于我片段的onCreateView
方法中。我仍然需要使用postDelayed
来获取正确的值。
final View top = (View) view.findViewById(R.id.top);
final View bottom = (View) view.findViewById(R.id.bottom);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
int topLoc[] = new int[2];
top.getLocationOnScreen(topLoc);
int BottomLoc[] = new int[2];
bottom.getLocationOnScreen(BottomLoc);
Log.d(Constants.debug, "topY: "+ topLoc[1]+" BottomY:" + BottomLoc[1]);
}
},4000);
我有一个Nexus 4。
在常规模式下(状态栏和显示的软按钮):
07-05 02:28:23.367 565-565/com.torcellite.xx D/xx: topY: 50 BottomY:1182
在全屏模式下(未显示状态栏或软按钮):
07-05 02:29:17.360 707-707/com.torcellite.xx D/xx: topY: 0 BottomY:1280
现在你所要做的就是减去。
答案 2 :(得分:2)
用于显示
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int height = displaymetrics.heightPixels;
int width = displaymetrics.widthPixels;
状态栏
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
答案 3 :(得分:2)
我没有尝试过不同的API,但我正在使用这些值来判断屏幕键盘是否已启动。也许你可以试试这个和宽度相当的东西来得到你需要的东西吗?
Rect r = new Rect();
view.getWindowVisibleDisplayFrame(r);
int
screenHeight = view.getRootView().getHeight(), // height of the entire screen
appHeight = r.bottom - r.top, // height of the entire app
statusBarHeight = r.top, // height of the statusbar
pageHeight = view.getHeight(), // height of the app without title
appTitleHeight = appHeight - pageHeight, // height of the only the app title
topHeight = statusBarHeight + appTitleHeight;
答案 4 :(得分:2)
final View view = findViewById(R.id.root);
ViewTreeObserver vto = view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// calculate the height in here...
ViewTreeObserver vto = view.getViewTreeObserver();
vto.removeGlobalOnLayoutListener(this);
}
});
在onCreate
内使用此侦听器(自api 1起可用)。您需要将id @+id/root
分配给xml布局中的父级。大小无法返回0的结果,因为只要布局在视图中定位,此侦听器就会进行回调。
答案 5 :(得分:1)
Display currentDisplay = getWindowManager().getDefaultDisplay();
float dw = currentDisplay.getWidth();
float dh = currentDisplay.getHeight();
dh
将为您提供屏幕高度。
答案 6 :(得分:0)
如何将子类View设置为Activity的根目录。使此视图填满屏幕(它不会超过状态栏)并覆盖onSizeChanged()。存储这些值并为它们写一个getter。
答案 7 :(得分:0)
礼貌-Francesco Feltrinelli它可能无法解答您的问题,但知道(我是 当我遇到这个问题时,我自己寻找它,如果你需要一个 查看维度但您的代码在布局时正在执行 还没有布局(例如在onCreate()中)你可以设置一个 ViewTreeObserver.OnGlobalLayoutListener with View.getViewTreeObserver()。addOnGlobalLayoutListener()并放入 需要视图维度的相关代码。听众的 布局布局后将调用回调。
你可以尝试这样做。
答案 8 :(得分:0)
获取活动加载的根布局的高度。如果它没有填满屏幕,则将其放在另一个布局中,其高度属性为fill_parent。