当前位置: 代码迷 >> Android >> Java上的Android布局编码:声明位置
  详细解决方案

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

热度:116   发布时间:2023-08-04 12:28:49.0

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

这是为什么?

一旦调用onCreate()便会创建Activitycontext
在第一种情况下,您没有设置上下文。

@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接口,所以在它们没有被构造之前,您不能使用它们,在构造函数被调用并结束之后 ,可以考虑完成这些操作。

内联初始化的字段成员也必须在对象构造期间进行初始化,因为那是它们的初始化思想所在……

因此,在短期,你要初始化需要的东西(上下文) 字段成员 ,因为尚未创建( 这一点 )这是尚未公布。

;)

  相关解决方案