Android: не удается найти конструктор для пользовательского LinearLayout

1

Я пытаюсь создать пользовательский LinearLayout (на Android), но я продолжаю получать ошибки компилятора при попытке использовать его в моем основном классе Activity. Расширенному LinearLayout нужен Контекст, переданный ему конструктором, но я не знаю, где его получить. Все примеры, которые я вижу, показывают прохождение этого указателя из 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);
    }
}

Решение:

Похоже, проблема состояла в двух проблемах.

  • Конструкторы не имеют типа void (неосторожная ошибка с моей стороны).
  • Пришлось вызвать "super (context)" как первую инструкцию в конструкторе.
  • 0
    Вы импортируете свой класс BoardLayout?
Теги:
android-layout

2 ответа

2
Лучший ответ

Проблема заключается в том, что у вас нет конструктора, который принимает 1 аргумент в BoardLayout. Как отмечено в комментариях, первый isn0t является конструктором, но методом.

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

Имейте в виду, что Java неявно вызывает super() без аргументов, если вы явно не вызываете super. Поскольку LinearLayout не имеет конструктора, который не принимает аргументов, вы должны явно вызвать супер, чтобы избежать ошибок компиляции.

  • 0
    Первый на самом деле не является конструктором, поскольку имеет тип возвращаемого значения и, следовательно, является методом.
  • 0
    о да. извините, я пропустил это. Но тогда проблема еще яснее. Там нет конструктора BoardLayout, который принимает 1 аргумент;)
Показать ещё 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню