Activity Layout It's Views 什么时候

When does an Activity Layout It's Views

我想知道在 Activities 生命周期中视图何时开始布局,或者视图组何时决定自己布局的时间。

我有一个 class 和 activity 设置成这样 ->

public class MainActivity extends AppCompatActivity
{
   protected void onCreate(Bundle savedInstanceState)
   {
      Log.i("i", "on Create");
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      myStack = (myStack) findViewById(R.id.myStack);
      myStack.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
     {
         @Override
         public void onGlobalLayout()
         {
         Log.i("i", "listener detected Layout");
         }
      }
      myStackAdapter adapter = new myStackAdapter(dataset);
      myStack.setAdapter(adapter);
   }
   protected void onStart()
   {
      Log.i("i", "on Start");
      super.onStart();
   }
}

public class myStack extends ViewGroup
{
   public myStack(Context context, AttributeSet attrs, int defStyleAttr)
   {
      super(context, attrs, defStyleAttr);
      initialize();
   }
   public void initialize()
   {
      Log.i("i", "initialize called");
   }
   public void onLayout(boolean changed, int l, int t, int r, int b)
   {
      Log.i("i", "on Layout");
      if (adapter == null)
      {
         Log.i("i", "adapter is null");
         return;
      }
      for (conditions)
      {
         addNextView();
      }
   }
   public void setAdapter(Adapter adapter)
   {
      Log.i("i", "adapter set");
      this.adapter = adapter;
   }

输出结果如下

编辑:添加了更多检查, 输出是 -on Create,-initialize called,-adapter set,-on Start,-on Layout,-listener detected layout

但是,这对我来说意味着 onLayout 仅在从 MainActivity 调用 setAdapter 之后调用,因为默认情况下我的适配器为 null。所以我想知道什么时候第一次触发 onLayout 。是在 MainActivity 中的 onCreate 完成之后(可能在 onStart 期间)吗?或者还有其他一些原因为什么 onLayout (在 onMeasure 之后)不会成为实例化 myStack 时调用的第一件事。

onLayout()layout() 内调用,当视图大小更改或测量阶段完成后并且 mPrivateFlags 包含 PFLAG_LAYOUT_REQUIRED 位集。

很可能您的 myStack class 没有改变大小,也没有要求设置布局标志,因为它还没有包含任何子视图。

一旦你设置了适配器,子视图就会被插入并改变视图组的大小,因此onLayout()被触发。