Java上的Android布局编码:声明位置

时间:2014-03-09 18:29:03

标签: android android-layout

我正在尝试在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);
    }
}

为什么?

2 个答案:

答案 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接口,你不能在它们构造之前使用它们,这可以被认为是构造函数被调用并结束之后完成的。

内联初始化的字段成员也必须在对象构造期间初始化,因为这是他们初始化的想法......

简而言之,您正在尝试初始化字段成员,因为尚未创建( )。