问题描述
我正在尝试在Java上编码android布局。 然后,我注意到以下代码不正确(如无法正常工作):
public class MainActivity extends Activity {
LinearLayout topLayout = new LinearLayout(this);
Button button1 = new Button(this);
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
... setText, layoutParam and etc ...
topLayout.addView(button1, layoutParam);
setContentView(topLayout);
}
}
而以下代码正确(有效)时:
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
LinearLayout topLayout = new LinearLayout(this);
Button button = new Button(this);
... setText, layoutParm and etc ...
topLayout.addView(button1, layoutParam);
setContentView(topLayout);
}
}
这是为什么?
1楼
一旦调用onCreate()
便会创建Activity
的context
。
在第一种情况下,您没有设置上下文。
2楼
@Blundell的评论对此进行了解释,但是如果您想更深入一点,则需要了解对象的生命周期和事物的顺序。
最后,一个Activity是一个Java对象。 因此,它必须经过Java Object创建过程。
public class MainActivity extends Activity {
LinearLayout topLayout = new LinearLayout(this);
Button button1 = new Button(this);
成员变量(或字段)是在构造函数之后立即创建的。 如果没有构造函数,则会为您创建一个构造函数(即使您看不到它),也可以尝试创建一个:
public class MainActivity extends Activity {
public MainActivity() {
super();
Log.d("MAINACTIVITY", "Constructor!");
}
现在将日志添加到您的onCreate()…
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d("MAINACTIVITY", "onCreate!");
}
开始您的活动并查看日志。
您应该看到:
Constructor!
onCreate!
话虽这么说,因为一个Activity实现了一个Context接口,所以在它们没有被构造之前,您不能使用它们,在构造函数被调用并结束之后 ,可以考虑完成这些操作。
内联初始化的字段成员也必须在对象构造期间进行初始化,因为那是它们的初始化思想所在……
因此,在短期,你要初始化需要的东西(上下文) 字段成员 ,因为尚未创建( 这一点 )这是尚未公布。
;)