Java 安卓:can';找不到自定义LinearLayout的构造函数

Java 安卓:can';找不到自定义LinearLayout的构造函数,java,android,android-layout,Java,Android,Android Layout,我试图创建一个定制的LinearLayout(在Android上),但在我的主Activity类中使用它时,我总是会遇到编译器错误。扩展的LinearLayout需要一个由构造函数传递给它的上下文,但我不知道从哪里获取该上下文。我看到的所有示例都显示了从活动传递此指针。我做错了什么 编译错误 MyApp.java:15: cannot find symbol symbol: constructor BoardLayout(com.test.program.MyApp) location: cla

我试图创建一个定制的LinearLayout(在Android上),但在我的主Activity类中使用它时,我总是会遇到编译器错误。扩展的LinearLayout需要一个由构造函数传递给它的上下文,但我不知道从哪里获取该上下文。我看到的所有示例都显示了从活动传递此指针。我做错了什么

编译错误

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);
    }
}

解决方案:

看来问题出在两个方面

  • 构造函数没有类型void(我犯了粗心的错误)
  • 必须调用“super(context)”作为构造函数中的第一条指令

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

    public BoardLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    但是,您正在调用的构造函数只传递了一个参数:

    BoardLayout board = new BoardLayout(this);
    
    BoardLayout board = new BoardLayout(this,null);
    
    如果要调用新构造函数,需要为第二个参数传入一个值:

    BoardLayout board = new BoardLayout(this);
    
    BoardLayout board = new BoardLayout(this,null);
    

    我不熟悉扩展LinearLayout,因此我不确定如何为
    属性集

    获取正确的值。问题是您没有在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没有不带参数的构造函数,因此必须超级显式调用以避免编译错误。

    是否导入BoardLayout类?第一个类实际上不是构造函数,因为它具有返回类型,因此是方法。啊,是的。我错过了。但问题就更清楚了。没有接受1个参数的BoardLayout构造函数;)