MyView (kontekst kontekstowy)
Używane podczas programowego tworzenia widoków.
MyView (kontekst kontekstowy, atrybuty zestawu atrybutów)
Używane przez the LayoutInflater
do stosowania atrybutów xml. Jeśli jeden z tych atrybutów jest nazwany style
, atrybuty będą przeszukiwane w stylu przed wyszukaniem jawnych wartości w pliku XML układu.
MyView (kontekst kontekstowy, atrybuty AttributeSet, int defStyleAttr)
Załóżmy, że chcesz zastosować domyślny styl do wszystkich widżetów bez konieczności określania ich style
w każdym pliku układu. Na przykład ustaw domyślnie wszystkie pola wyboru na różowo. Możesz to zrobić za pomocą defStyleAttr, a framework wyszuka domyślny styl w twoim motywie.
Zauważ, że jakiś czas temu defStyleAttr
został nieprawidłowo nazwany defStyle
i jest dyskusja na temat tego, czy ten konstruktor jest naprawdę potrzebny, czy nie. Zobacz https://code.google.com/p/android/issues/detail?id=12683
MyView (kontekst kontekstowy, atrybuty AttributeSet, int defStyleAttr, int defStyleRes)
Trzeci konstruktor działa dobrze, jeśli masz kontrolę nad motywem podstawowym aplikacji. To działa dla Google, ponieważ wysyłają swoje widżety obok domyślnych motywów. Ale załóżmy, że piszesz bibliotekę widżetów i chcesz, aby domyślny styl został ustawiony bez konieczności modyfikowania motywu przez użytkowników. Możesz to teraz zrobić defStyleRes
, ustawiając wartość domyślną w dwóch pierwszych konstruktorach:
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();
}
W sumie
Jeśli implementujesz własne widoki, tylko dwa pierwsze konstruktory powinny być potrzebne i mogą być wywoływane przez framework.
Jeśli chcesz, aby Twoje widoki były rozszerzalne, możesz zaimplementować czwarty konstruktor dla elementów podrzędnych Twojej klasy, aby móc używać stylów globalnych.
Nie widzę prawdziwego przypadku użycia trzeciego konstruktora. Może to skrót, jeśli nie podasz domyślnego stylu widgetu, ale nadal chcesz, aby użytkownicy mogli to robić. Nie powinno się tak często dziać.