如果我在onResume中为布局调用getMeasuredWidth()或getWidth(),则返回0

mob*_*lex 38 layout android measurement

如果我在onResume中为布局调用getMeasuredWidth()或getWidth(),则返回0.我认为此时此视图尚未显示.

另外我认为我需要在绘制布局后调用的回调方法中放置getMeasuredWidth()或getWidth(),并且已知视图测量.我应该使用什么android回调方法?

Ado*_*ncz 78

您无法使用width/ height/ getMeasuredWidth/ getMeasuredHeightView之前的系统使得它(通常为onCreate/ onResume).

对此的简单解决方案是Runnable将布局发布到布局.runnable将View在布局后执行.

BoxesLayout = (RelativeLayout) findViewById(R.id.BoxesLinearLayout);
BoxesLayout.post(new Runnable() {
    @Override
    public void run() {
        int w = BoxesLayout.getMeasuredWidth();
        int h = BoxesLayout.getMeasuredHeight();

        ...
    }
});
Run Code Online (Sandbox Code Playgroud)

  • ViewTreeObserver是一种更好的方法,因为在视图层次结构被绘制到屏幕之前,您可以获得宽度/高度的度量.如果你像这样使用.post(),视图可能会首先绘制一个帧,然后调用你的回调.如果要在Runnable中修改部分视图宽度/高度,可以看到发生变化的快速闪烁.使用ViewTreeObserver,您可以保证在屏幕绘制第一帧之前可以修改任何内容.但是,如果您没有修改Runnable中的任何视图,那么这两种方法都可以正常工作. (16认同)
  • 我总是使用`ViewTreeObserver`方法,但这样做更简单! (8认同)
  • 非常感谢.工作很棒. (2认同)

Jef*_*rod 37

这个答案说:

使用ViewTreeObserverView等待第一个布局.只有在第一次布局后才能getWidth()/getHeight()/getMeasuredWidth()/getMeasuredHeight()工作.

ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
  viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
      view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
      viewWidth = mediaGallery.getWidth();
      viewHeight = mediaGallery.getHeight();
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

  • 我很惊讶,挂钩任何生命周期回调都无法获得宽度.我尝试了所有这些,onCreate(),onStart(),onResume(),并且没有在任何一个中设置布局的宽度.这个解决方案是第一件对我有用的方法.谢谢发帖. (2认同)

MrJ*_*Jre 5

你可以在视图中覆盖onLayout() ; 这是由android用来定位视图所具有的每个子节点,所以你可以在super(..)调用之后做你想要做的事情.