显示指标减去状态栏?

J-R*_*Rou 31 android

我需要获取应用程序可以在设备上使用的显示矩形的尺寸.为此,我尝试使用:

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

我的问题是它给了我整个显示器的高度,并且显示器顶部有一个"状态/通知"栏,应用程序无法使用.

我需要应用程序可以使用的实际维度.

为了帮助您更好地理解这个问题,我将留下一个图片:

在此输入图像描述

Dev*_*red 37

所有这一切的最大诀窍是,在布局完成之前,您通常无法访问该视图大小的真实值.这意味着onCreate()(通常也是onResume())在进行计算的过程中还为时过早.下面的代码将为您提供一个表示内容视图的视图Activity,此时您可以检查其高度和宽度:

View content = getWindow().findViewById(Window.ID_ANDROID_CONTENT);
Log.d("DISPLAY", content.getWidth() + " x " + content.getHeight());
Run Code Online (Sandbox Code Playgroud)

这也解释了您可能在中设置的任何标题视图Activity.当XML被夸大时,您还可以获得对设置为内容视图的根布局的引用,如果在两个维度中将布局设置为fill_parent,则执行相同的操作.

我经常拨打这样的电话的好方法是onWindowFocusChanged(),当您的活动对用户可见时,将调用该方法.

希望有帮助!

  • 或者在`ViewTreeObserver`中执行此操作https://gist.github.com/doridori/9208247 (3认同)

Pet*_*r F 9

此调用与您调用它的时间点无关:

...
Point dimensions = getDisplayDimensions(context);
int width = dimensions.x;
int height = dimensions.y;
...

@NonNull
public static Point getDisplayDimensions( Context context )
{
    WindowManager wm = ( WindowManager ) context.getSystemService( Context.WINDOW_SERVICE );
    Display display = wm.getDefaultDisplay();

    DisplayMetrics metrics = new DisplayMetrics();
    display.getMetrics( metrics );
    int screenWidth = metrics.widthPixels;
    int screenHeight = metrics.heightPixels;

    // find out if status bar has already been subtracted from screenHeight
    display.getRealMetrics( metrics );
    int physicalHeight = metrics.heightPixels;
    int statusBarHeight = getStatusBarHeight( context );
    int navigationBarHeight = getNavigationBarHeight( context );
    int heightDelta = physicalHeight - screenHeight;
    if ( heightDelta == 0 || heightDelta == navigationBarHeight )
    {
        screenHeight -= statusBarHeight;
    }

    return new Point( screenWidth, screenHeight );
}

public static int getStatusBarHeight( Context context )
{
    Resources resources = context.getResources();
    int resourceId = resources.getIdentifier( "status_bar_height", "dimen", "android" );
    return ( resourceId > 0 ) ? resources.getDimensionPixelSize( resourceId ) : 0;
}

public static int getNavigationBarHeight( Context context )
{
    Resources resources = context.getResources();
    int resourceId = resources.getIdentifier( "navigation_bar_height", "dimen", "android" );
    return ( resourceId > 0 ) ? resources.getDimensionPixelSize( resourceId ) : 0;
}
Run Code Online (Sandbox Code Playgroud)

诀窍在于它比较屏幕显示指标(您想要以状态栏为模的指标)和“真实指标”,即设备的物理像素。

如果还没有发生,则状态栏高度会被临时减去。

(在我的测试中,包含返回和主页按钮的导航栏已经被减去。)