在哪个状态 activity 测量它的视图

In which state activity measure it's view

我创建了一个自定义的 ViewGroup ReadPage,我在 activity 中使用了它

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    pager=(ReadPage)findViewById(R.id.readpage);
    pager.addArticle("...");
}

而 addArticle 需要视图的宽度和高度

public void addArticle(String s){
        articles.add(new Article(s,getMeasuredWidth(),getMeasuredHeight()));
}

但此时measurewidth和measureheight为0。 所以我想知道将在哪个状态下测量视图,以便我可以获得它在屏幕上显示的正确值。

这个答案可能会满足您的需求:

你可能会这样使用它:

private int WIDTH;
private int HEIGHT;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);

    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    WIDTH = size.x;
    HEIGHT = size.y;

    pager = (ReadPage)findViewById(R.id.readpage);
    pager.addArticle("...");
}

// ...

public void addArticle(String s){
    articles.add(new Article(s, WIDTH, HEIGHT));
}

有时会在 "measure pass" 期间测量观看次数。当视图结构发生变化时(由于添加、删除、更新视图),将运行一个度量,然后运行一个重新计算视图大小和位置的布局过程。

例如,您可以随时将文本数据设置为TextView,但是当它准备好显示它时,View 本身决定如何显示它。然后计算文本变形等,而不是在设置文本时计算。

您应该将显示 Article 的视图设计成类似的。您可以提供数据,但让 View 在其 onSizeChanged() 被调用时进一步处理和显示它。视图还可以使用 addOnLayoutChangeListener() 来了解布局何时完成。

使用ViewTreeObserver

 viewToMeasure.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
              viewToMeasure.getViewTreeObserver().removeGlobalOnLayoutListener(this);
             /* you can get the view's height and width here 
                using  viewToMeasure.getWidth() and viewToMeasure.getHeight() 
             */                         
         }
  });