在代码中创建布局并获取 nullPointerException

create layout in code and get nullPointerException

我用纯代码创建布局。 它奏效了,我决定创建另一个 class 来重用我的布局。

我添加了一个新的 class (Designer.java),以便在其他活动中重复使用我的页脚和页眉。

我将上下文作为参数传递给其他活动。

我不明白怎么了。我一定是错过了什么

MainActivity.java

RelativeLayout relMainActivity ;

@Override
protected void onCreate(Bundle savedInstanceState) {

    // ...
    Designer design = new Designer();
    design.createDesign(relMainActivity, this);
    // relMainActivity = null in debug

    setContentView(relMainActivity);
    // java.lang.NullPointerException

}

Designer.java

RelativeLayout relHeader, relFooter, relContent;

public void createDesign(RelativeLayout rel2MainActivity, Context context) {

  rel2MainActivity = new RelativeLayout(context);
  // ...
  rel2MainActivity.addView(relHeader, 0);
  rel2MainActivity.addView(relContent, 1);
  rel2MainActivity.addView(relFooter, 2);
  // rel2MainActivity has 3 children in debug 

}

in createDesign 方法直接使用 relMainActivity 或 RelativeLayout 的 return 实例,并在调用 createDesign 方法后立即将其分配给 onCreate 中的 relMainActivity .

您在 createDesign() 中添加了 3 个视图,但您没有将该视图传回被调用方。

因此,它将 null 赋给 relMainActivity

解法:

这里是你打电话的时候:

    RelativeLayout relHeader, relFooter, relContent;

public RelativeLayout createDesign(RelativeLayout rel2MainActivity, Context context) {

  rel2MainActivity = new RelativeLayout(context);
  // ...
  rel2MainActivity.addView(relHeader, 0);
  rel2MainActivity.addView(relContent, 1);
  rel2MainActivity.addView(relFooter, 2);
  // rel2MainActivity has 3 children in debug 
   // rel2MainActivity view is local to this scope
   // you should return it
   return rel2MainActivity;


}

并在 :

获取
RelativeLayout relMainActivity ;

@Override
protected void onCreate(Bundle savedInstanceState) {

    // ...
    Designer design = new Designer();
    relMainActivity = design.createDesign(relMainActivity, this);
    // relMainActivity = null in debug

    setContentView(relMainActivity);

}

你的文件变量relMainActivity1在这行代码

之后保持为空
design.createDesign(relMainActivity, this);

中使用之前,您应该更改代码以初始化 relMainActivity1
setContentView(relMainActivity);

  public RelativeLayout createDesign(RelativeLayout rel2MainActivity, Context context) {

      rel2MainActivity = new RelativeLayout(context);
      // ...
      rel2MainActivity.addView(relHeader, 0);
      rel2MainActivity.addView(relContent, 1);
      rel2MainActivity.addView(relFooter, 2);
      // rel2MainActivity has 3 children in debug 

    return rel2MainActivity
    }

然后将其用作

relMainActivity= design.createDesign(relMainActivity, this);
setContentView(relMainActivity);