MyView (контекст контекста)
Используется при программном создании экземпляров Views.
MyView (контекст контекста, атрибуты AttributeSet)
Используется LayoutInflater
для применения атрибутов xml. Если один из этих атрибутов назван style
, атрибуты будут проверяться по стилю перед поиском явных значений в XML-файле макета.
MyView (контекст контекста, атрибуты AttributeSet, int defStyleAttr)
Предположим, вы хотите применить стиль по умолчанию ко всем виджетам без необходимости указывать его style
в каждом файле макета. Например, по умолчанию сделайте все флажки розовыми. Вы можете сделать это с помощью defStyleAttr, и фреймворк будет искать стиль по умолчанию в вашей теме.
Обратите внимание, что некоторое время назад он defStyleAttr
был неправильно назван, defStyle
и есть некоторые дискуссии о том, действительно ли этот конструктор нужен или нет. См. Https://code.google.com/p/android/issues/detail?id=12683
MyView (контекст контекста, атрибуты AttributeSet, int defStyleAttr, int defStyleRes)
Третий конструктор работает хорошо, если у вас есть контроль над базовой темой приложений. Это работает для Google, потому что они поставляют свои виджеты вместе с темами по умолчанию. Но предположим, что вы пишете библиотеку виджетов и хотите установить стиль по умолчанию, при этом вашим пользователям не нужно настраивать свою тему. Теперь вы можете сделать это defStyleRes
, установив для него значение по умолчанию в двух первых конструкторах:
public MyView(Context context) {
super(context, null, 0, R.style.MyViewStyle);
init();
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs, 0, R.style.MyViewStyle);
init();
}
В общем
Если вы реализуете свои собственные представления, необходимы только 2 первых конструктора, которые могут вызываться фреймворком.
Если вы хотите, чтобы ваши представления были расширяемыми, вы можете реализовать 4-й конструктор для дочерних элементов вашего класса, чтобы иметь возможность использовать глобальный стиль.
Я не вижу реального варианта использования третьего конструктора. Может быть, это ярлык, если вы не предоставляете стиль по умолчанию для своего виджета, но все же хотите, чтобы ваши пользователи могли это сделать. Этого не должно случиться.