我需要获取应用程序可以在设备上使用的显示矩形的尺寸.为此,我尝试使用:
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(),当您的活动对用户可见时,将调用该方法.
希望有帮助!
此调用与您调用它的时间点无关:
...
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)
诀窍在于它比较屏幕显示指标(您想要以状态栏为模的指标)和“真实指标”,即设备的物理像素。
如果还没有发生,则状态栏高度会被临时减去。
(在我的测试中,包含返回和主页按钮的导航栏已经被减去。)
| 归档时间: |
|
| 查看次数: |
14781 次 |
| 最近记录: |