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()
被触发。
我想知道在 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()
被触发。