getWidth()和getHeight()总是返回0.自定义视图

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

在片段中,我使用多个子视图来扩展布局。我需要获取其中一个是自定义视图的尺寸(宽度和高度)。

在自定义视图类中,我可以轻松地做到这一点。但是,如果我试图从片段中做到这一点,我总是得到0作为尺寸。

 public void onViewCreated(View view, Bundle savedInstanceState) {

    super.onViewCreated(view, savedInstanceState);
    View culoide = view.findViewWithTag(DRAW_AREA_TAG);
    Log.d("event", "culoide is: "+culoide.getWidth()); // always 0
}

我认为onViewCreated应该是获得它的正确地点,但是这恰好发生了。我在super.onViewCreated之前尝试过,在调试时它看起来像'findViewWithTag'找到正确的视图,只用api 7 v4支持。

提问于
用户回答回答于

你必须等到为了得到非零值的第一项措施和布局后getWidth()getHeight()。你可以用一个ViewTreeObserver.OnGlobalLayouListener

public void onViewCreated(final View view, Bundle saved) {
    super.onViewCreated(view, saved);
    view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        public void onGlobalLayout() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
              view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            } else {
              view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }

            // get width and height of the view
        }
    });
}
用户回答回答于

我的首选方法是添加OnLayoutChangeListener到你想要追踪自己的视图。

CustomView customView = ...

customView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        // Make changes
    }
});

如果只需要初始布局,则可以删除回调中的侦听器。

扫码关注云+社区