MyView (контекст контексту)
Використовується при інстанціюванні переглядів програмно.
MyView (контекст контексту, AttributeSet attrs)
Використовується LayoutInflater
атрибутами xml для застосування. Якщо один з цього атрибута названий style
, атрибути будуть шукати стиль, перш ніж шукати явні значення у файлі xml-макета.
MyView (контекст контексту, AttributeSet attrs, int defStyleAttr)
Припустимо, ви хочете застосувати стиль за замовчуванням до всіх віджетів, не вказуючи style
в кожному файлі макета. Для прикладу зробіть усі прапорці рожевими за замовчуванням. Це можна зробити за допомогою defStyleAttr, і фреймворк знайде стиль за замовчуванням у вашій темі.
Зауважте, що це defStyleAttr
було неправильно названо defStyle
деякий час тому, і є певна дискусія щодо того, чи потрібен цей конструктор чи ні. Див. Https://code.google.com/p/android/isissue/detail?id=12683
MyView (контекст контексту, AttributeSet attrs, int defStyleAttr, int defStyleRes)
3-й конструктор добре працює, якщо ви маєте контроль над базовою темою додатків. Це працює для 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();
}
Загалом
Якщо ви реалізуєте власні погляди, потрібні лише два перших конструктори, які можуть бути викликані рамкою.
Якщо ви хочете, щоб ваш погляд був розширюваним, ви можете реалізувати 4-й конструктор для дітей вашого класу, щоб мати можливість використовувати глобальний стиль.
Я не бачу справжнього випадку використання для 3-го конструктора. Може бути ярлик, якщо ви не надаєте стиль віджету за замовчуванням, але все ж хочете, щоб ваші користувачі могли це зробити. Не повинно відбуватися так багато.