我正在尝试在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);
}
}
为什么?
答案 0 :(得分:0)
调用context
后,Activity
的{{1}}即被创建
在第一种情况下,您没有设置上下文。
答案 1 :(得分:0)
@Blundell的评论解释了这一点,但如果你想深入一点,你需要了解对象的生命周期和事物的顺序。
Activity最终是一个Java对象。因此它必须通过Java对象创建过程。
public class MainActivity extends Activity {
LinearLayout topLayout = new LinearLayout(this);
Button button1 = new Button(this);
成员变量(或Fields)就在构造函数之后创建。如果你没有构造函数,就会为你创建一个(即使你没有看到它),你可以尝试创建一个:
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接口,你不能在它们构造之前使用它们,这可以被认为是在构造函数被调用并结束之后完成的。
内联初始化的字段成员也必须在对象构造期间初始化,因为这是他们初始化的想法......
简而言之,您正在尝试初始化字段成员,因为尚未创建(此 )。
)