我想知道在一个活动生命周期视图中何时开始布局,或者当一个视图组决定其布置自身的时间时。
我有一个类和活动设置如下 - >
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
但是,这意味着只有在从MainActivity调用setAdapter之后才调用onLayout,因为我的适配器默认为null。所以我想知道onLayout第一次被触发的时间。是在onCreate在MainActivity中完成之后(也许是在onStart期间)?或者还有一些其他原因,为什么onLayout(跟随onMeasure)不会是实例化myStack时调用的第一件事。
答案 0 :(得分:0)
onLayout()
包含layout()
位设置后,在mPrivateFlags
内调用 PFLAG_LAYOUT_REQUIRED
。
你的myStack
类很可能没有改变大小,也没有设置布局标志,因为它还没有包含任何子视图。
一旦设置了适配器,就会插入子视图并更改视图组大小,因此会触发onLayout()
。