在Android中获取屏幕高度

Dan*_*ray 18 java layout android screen android-layout

如何在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);
Run Code Online (Sandbox Code Playgroud)

这不考虑状态栏/菜单栏:

Display display = getWindowManager().getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();
Run Code Online (Sandbox Code Playgroud)

这也不是:

Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
screenWidth = size.x;
screenHeight = size.y;
Run Code Online (Sandbox Code Playgroud)

这不是:

Point size = new Point();
getWindowManager().getDefaultDisplay().getRealSize(size);
screenWidth = size.x;
screenHeight = size.y;
Run Code Online (Sandbox Code Playgroud)

这不起作用:

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
}
Run Code Online (Sandbox Code Playgroud)

然后我使用以下代码从屏幕高度中减去状态栏和菜单栏的高度:

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;
Run Code Online (Sandbox Code Playgroud)

在API 17上,它正确地以纵向方式计算状态栏和菜单栏的高度,但不以横向方式计算.在API 10上,它返回0.我需要它在所有设备或最小API 7上理想地工作.

Pon*_*lar 6

如果您想要显示尺寸(以像素为单位),可以使用getSize:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
Run Code Online (Sandbox Code Playgroud)

如果您不在,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;
Run Code Online (Sandbox Code Playgroud)

getSize介绍之前(在API级别13中),您可以使用现在不推荐使用的getWidth和getHeight方法:

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated
Run Code Online (Sandbox Code Playgroud)

参考: 获取屏幕尺寸,以像素为单位


Kar*_*nan 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" />
Run Code Online (Sandbox Code Playgroud)

现在,您应该调用getLocationOnScreen(int [])这两个视图来接收它们的位置.此函数返回2个整数的数组.第一个是x,第二个是y.我们只需要y.另请注意,仅在创建所有视图并onCreate退出方法后才返回正确的值.

我在一个从viewpager调用的常规片段上测试了这段代码.

代码在onCreateView我片段的方法中.我仍然必须使用a 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);
Run Code Online (Sandbox Code Playgroud)

我有一个Nexus 4.

在常规模式下(状态栏和显示的软按钮):

07-05 02:28:23.367      565-565/com.torcellite.xx D/xx: topY: 50 BottomY:1182
Run Code Online (Sandbox Code Playgroud)

在全屏模式下(未显示状态栏或软按钮):

07-05 02:29:17.360      707-707/com.torcellite.xx D/xx: topY: 0 BottomY:1280
Run Code Online (Sandbox Code Playgroud)

你现在所要​​做的就是减去.