什么时候活动布局它的视图

时间:2017-09-07 04:21:33

标签: android android-layout view activity-lifecycle viewgroup

我想知道在一个活动生命周期视图中何时开始布局,或者当一个视图组决定其布置自身的时间时。

我有一个类和活动设置如下 - >

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 Layout

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

但是,这意味着只有在从MainActivity调用setAdapter之后才调用onLayout,因为我的适配器默认为null。所以我想知道onLayout第一次被触发的时间。是在onCreate在MainActivity中完成之后(也许是在onStart期间)?或者还有一些其他原因,为什么onLayout(跟随onMeasure)不会是实例化myStack时调用的第一件事。

1 个答案:

答案 0 :(得分:0)

当视图大小更改或测量阶段结束且onLayout()包含layout()位设置后,在mPrivateFlags内调用

PFLAG_LAYOUT_REQUIRED

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

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