2011-11-13 2 views
19

У меня есть пользовательский вид, расширенный с View. Есть 3 вид Конструкторы:Какой конструктор вызывать для просмотра?

  1. View(Context context, AttributeSet attrs, int defStyle)
  2. View(Context context, AttributeSet attrs)
  3. View(Context context)

С моей деятельности я называю std.setContentView(R.layout.main). На мой взгляд, второй конструктор вызван. Почему второй? Как заранее знать, какой из них будет называться и почему?

ответ

41

С сайта разработчиков Android под документации Вид:

public View (Context context)

Простой конструктор использовать при создании вида из кода.

Таким образом, этот конструктор - это то, что вы можете использовать для создания представления в Java. Он не будет вызываться, когда вы будете раздуваться от XML.

public View (Context context, AttributeSet attrs)

Конструктор, который вызывается при раздувании вид из XML. Это вызывается, когда представление создается из файла XML, поставляя атрибуты, указанные в файле XML. Эта версия использует стиль по умолчанию 0, поэтому применяются только значения атрибутов в теме Контекста и заданном атрибуте.

Метод onFinishInflate() будет вызываться после того, как будут добавлены все дети.

Таким образом, этот конструктор будет вызываться, когда вы раздуваете представление из XML, когда вы не укажете стиль.

public View (Context context, AttributeSet attrs, int defStyle)

Выполните инфляцию с XML и применить базовый стиль класса конкретного. Этот конструктор View позволяет подклассам использовать свой собственный базовый стиль, когда он раздувается. Например, конструктор класса Button назвал бы эту версию конструктора суперкласса и предоставил R.attr.buttonStyle для defStyle; это позволяет стилю кнопки темы изменять все атрибуты базового вида (в частности, его фон), а также атрибуты класса Button.

Вы должны реализовать все эти конструкторы, но вы можете поместить все работы в третьем по телефону this(context, null) и this(context, attrs, 0) для первых двух, соответственно.

+2

super (context, attrs) и super (context, attrs, 0) работает по-разному для меня. Первый - это нормально, но второй удаляет оригинальный стиль из представления, поэтому я не могу использовать его (context, attrs, 0). Это ошибка в новых версиях Android? – broot

+1

Пожалуйста, не вызывайте вызовы конструктора каскада, см. Мой ответ ниже. – Jin

+0

Я полагаю, что это ответ Цзинь: http://stackoverflow.com/a/34301725/326874 – aeracode

Смежные вопросы