在onCreate获取内容视图大小

我正在寻找一种很好的方法来衡量Android中的活动的实际内容区域的维度。

获取显示始终有效。 简单地去这样做:

Display display = getWindowManager().getDefaultDisplay(); 

你可以得到整个屏幕的像素数。 当然,这不考虑ActionBar,状态栏或任何其他视图,这会减less活动本身的可用大小。

一旦活动正在运行,您可以这样做:

 View content = getWindow().findViewById(Window.ID_ANDROID_CONTENT); 

仅获取活动内容。 但是在onCreate()中做这个会导致宽度和高度都是0的视图。

有没有办法让onCreate这些尺寸? 我想应该有一种方法来获得任何状态栏的测量,只是从总显示尺寸中减去,但我无法find一种方法来做到这一点。 我认为这将是唯一的方法,因为在绘制之前,内容窗口方法总是返回一个没有宽度/高度的视图。

谢谢!

Solutions Collecting From Web of "在onCreate获取内容视图大小"

你可以根据你的目标使用一个布局或预绘制的监听器。 例如,在onCreate()中:

 final View content = findViewById(android.R.id.content); content.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { //Remove it here unless you want to get this callback for EVERY //layout pass, which can get you into infinite loops if you ever //modify the layout from within this method. content.getViewTreeObserver().removeGlobalOnLayoutListener(this); //Now you can get the width and height from content } }); 

(从我的答案复制到相关的问题 )

我使用以下技术 – 从onCreate()发布一个runnable,在创build视图时执行:

  contentView = findViewById(android.R.id.content); contentView.post(new Runnable() { public void run() { contentHeight = contentView.getHeight(); } }); 

这个代码将在onCreate()完成后在主UI线程上运行。

这似乎是一个重复的问题。 在这个SO问题中有一个优雅的答案:

getWidth()和getHeight()的View返回0

其中(无耻复制)是重写onWindowFocusChanged(),这似乎在onCreate()之后触发,并呈现大小的位置:

 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); //Here you can get the size! } 

您可以在onResume执行任何需要大小的工作(使用像alreadyDone这样的标志,每当Activity进入前台时都不要重复)。 在onCreate视图不显示,所以这是正常的大小是零。