2012-04-09 9 views
15

Nie jestem zbyt jasne o tym i nie są również docs.Czy muszę oddzwonić super.onDraw() w niestandardowym widoku?

Kiedy tworzę własny widok, zastąpić tak:

@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    //more code here... 
} 

Moje pytanie brzmi, czy jest to konieczne, aby zadzwonić super.onDraw(canvas);. Kod wydaje się działać bez niego, ale chcę mieć pewność, że można go pominąć.

Czy jest to konieczne?

+0

Nie wiem, czy jest to potrzebne, ale z zasady jest to dobra praktyka. – trutheality

+0

Musisz tylko wywołać 'super.onDraw()' jeśli chcesz, aby kod był implementowany również przez maszyny klasy superklasy. Jeśli nie polegasz na rysunku, który wykonuje twoja niestandardowa "nadrzędna" klasa widoku (np. Wszystkie wymagane rysunki są wykonywane w metodzie overriden), to nie musisz tego wywoływać, chyba że w dokumentacji wyraźnie podano inaczej. –

Odpowiedz

13

Jeśli chcesz wywołać superklasę w metodzieDraw (pomyśl TextView lub KeyboardView zamiast ogólnego widoku), a następnie wywołaj super.onDraw. Jeśli tego nie chcesz, tzn. Masz zamiar narysować cały widok sam (który wydaje się, że jesteś), nie ma powodu, aby go wywoływać.

Ponadto, jeśli rozszerzasz widok (a nie jakaś klasę, która rozszerza widok), super.onDraw tak naprawdę nic nie robi.

Dla mnie, nazywam super.onDraw, gdy chcę narysować linie nad widokiem klawiatury. Tak więc super.onDraw rysuje klawiaturę, a mój niestandardowy LatinKeyboardView (który rozszerza KeyboardView) rysuje przesuwającą ścieżkę na klawiaturze.

+0

Tak, po drugie, KeyboardView wymaga super.onDraw(), jeśli chcesz narysować coś ekstra na klawiszach. –

0

Nie jest wymagana, chyba że faktycznie nadpisujesz metodę onDraw(). Jeśli nowa klasa go nie zastąpi, metoda super zostanie automatycznie wywołana.

+0

? W moim pytaniu wyraźnie napisałem, że jestem * nadpisuję to ... – yydl

+0

@yydl, tak, tak by było. – Whymarrh

2

Tak, jest. Jeśli dostosujesz TextView, super.onDraw zapewni rysowanie elementów należących do atrybutów TextView (takich jak tekst, kolor tekstu, cień tekstu, itp.) Tak samo z innymi widokami, takimi jak Button, CheckBox ...

W przypadku niestandardowego widoku Rozszerz widok (nie jest to konkretna podklasa widoku, po prostu Zobacz), nadal lepiej jest zostawić super.onDraw (canvas) tam dla niektórych metod rysowania widoku (takich jak setBackgroundDrawable, itp.)

8

Peek na kodzie źródłowym pokazuje, że View.onDraw() jest pustą metodą. Tak więc wywołanie super.onDraw(), jeśli klasa nadrzędna to sama View, nic nie robi. To niepotrzebne, ale nieszkodliwe.

Niezależnie od tego, czy powinieneś iść dalej i tak czynić, to osobna kwestia wydajności, bezpieczeństwa i stylu.

Powiązane problemy