Android:无法找到自定义LinearLayout的构造函数

时间:2011-01-03 22:39:16

标签: java android android-layout

我正在尝试创建自定义LinearLayout(在Android上),但在我的主Activity类中尝试使用它时,我一直遇到编译器错误。扩展的LinearLayout需要构造函数传递给它的Context,但我不知道从哪里获取该Context。我看到的所有示例都显示了此指针从Activity中传递。我做错了什么?

编译器错误

MyApp.java:15: cannot find symbol
symbol: constructor BoardLayout(com.test.program.MyApp)
location: class com.test.program.BoardLayout
    BoardLayout board = new BoardLayout(this);

BoardLayout.java

public class BoardLayout extends LinearLayout {
    public void BoardLayout(Context context) {
        // initialisation code
    }
    public BoardLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
    }
}

MyApp.java

public class MyApp extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        BoardLayout board = new BoardLayout(this); // Doesn't work!
        setContentView(board);
    }
}

解决方案:

看起来问题是两个问题。

  1. 构造函数没有类型void(我不小心的错误)。
  2. 必须将“super(context)”称为构造函数中的第一条指令。

2 个答案:

答案 0 :(得分:2)

问题是你没有在BoardLayout中接受1个参数的构造函数。正如评论中指出的那样,第一个不是构造函数,而是一个方法。

public class BoardLayout extends LinearLayout {
   public void BoardLayout(Context context) {
      // initialisation code
   }
   public BoardLayout(Context context, AttributeSet attrs) {
      super(context, attrs);
   }
}

请记住,如果没有显式调用super,Java会隐式调用不带参数的super()。由于LinearLayout没有不带参数的构造函数,因此必须显式调用super以避免编译错误。

答案 1 :(得分:0)

我不是100%肯定,但你定义的构造函数需要两个参数:

public BoardLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

但是,您调用的构造函数只传递一个参数:

BoardLayout board = new BoardLayout(this);

如果要调用新构造函数,则需要传入第二个参数的值:

BoardLayout board = new BoardLayout(this,null);

我不熟悉扩展LinearLayout所以我不确定如何为AttributeSet

获取正确的值