Dobrze zaprojektowany widok niestandardowy jest jak inne dobrze zaprojektowane zajęcia. Zawiera on określony zestaw ma prosty interfejs, wydajnie korzysta z procesora oraz pamięci i tak dalej. W oprócz bycia dobrze zaprojektowana klasa, widok niestandardowy musi:
- Zgodność ze standardami Androida.
- Podaj niestandardowe atrybuty z możliwością zmiany stylu, które działają w układach XML na Androida.
- Wysyłaj zdarzenia dotyczące ułatwień dostępu.
- Zadbaj o zgodność z wieloma platformami Androida.
Platforma Androida udostępnia zestaw klas podstawowych i tagów XML ułatwiających utworzenie widoku, który spełnia wszystkie te kryteria . Z tej lekcji dowiesz się, jak wykorzystać platformę Androida do stworzenia podstawowej funkcjonalność widoku zajęcia.
Dodatkowe informacje na temat informacje o komponentach widoku niestandardowego.
Podklasy widoku danych
Wszystkie klasy widoku zdefiniowane w platformie Androida są rozszerzane
View
Twoje
za pomocą widoku niestandardowego
rozszerzenie View
bezpośrednio lub
zaoszczędzić czas, wydłużając
istniejący widok
i podklasy, takie jak Button
.
Aby umożliwić Android Studio interakcję z widokiem, musisz udostępnić co najmniej konstruktor, który
Context
i obiekt AttributeSet
jako parametry.
Ten konstruktor umożliwia edytorowi układu tworzenie i edytowanie instancji widoku.
Kotlin
class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs)
Java
class PieChart extends View { public PieChart(Context context, AttributeSet attrs) { super(context, attrs); } }
Zdefiniuj atrybuty niestandardowe
Aby dodać do interfejsu wbudowany element View
, podaj go w elemencie XML i
kontrolować
na ich wygląd i działanie za pomocą atrybutów elementów. Możesz też dodać niestandardowe elementy zamówienia i określić ich styl
za pomocą języka XML. Do
włącz to działanie w widoku niestandardowym, wykonaj te czynności:
- Zdefiniuj atrybuty niestandardowe widoku w elemencie zasobu
<declare-styleable>
. - Określ wartości atrybutów w układzie XML.
- Pobieranie wartości atrybutów w czasie działania.
- Zastosuj pobrane wartości atrybutów do widoku.
W tej sekcji omówiono definiowanie atrybutów niestandardowych i określanie ich wartości. W następnej sekcji omawiamy: pobierania i stosowania wartości w czasie działania.
Aby zdefiniować atrybuty niestandardowe, dodaj do projektu zasoby (<declare-styleable>
). Zwykle zasoby te umieszcza się w
res/values/attrs.xml
. Oto
przykład pliku attrs.xml
:
<resources> <declare-styleable name="PieChart"> <attr name="showText" format="boolean" /> <attr name="labelPosition" format="enum"> <enum name="left" value="0"/> <enum name="right" value="1"/> </attr> </declare-styleable> </resources>
Ten kod deklaruje dwa atrybuty niestandardowe: showText
i labelPosition
,
które należą do
encja o nazwie PieChart
. Nazwa elementu z możliwością stylu jest, zgodnie z konwencją, taka sama
jako
nazwa zajęć
który definiuje widok niestandardowy. Chociaż przestrzeganie tej konwencji nie jest konieczne,
wiele popularnego kodu
korzystają z tej konwencji nazewnictwa, aby uzupełniać instrukcje.
Po zdefiniowaniu atrybutów niestandardowych możesz ich używać w plikach XML układu, tak jak w przypadku plików wbudowanych
. Jedyna
różnica polega na tym, że atrybuty niestandardowe należą do innej przestrzeni nazw. Zamiast poczucia przynależności
do przestrzeni nazw http://schemas.android.com/apk/res/android
, należą do domeny http://schemas.android.com/apk/res/[your package name]
. Aby na przykład użyć atrybutu
atrybuty zdefiniowane dla
PieChart
:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto"> <com.example.customviews.charting.PieChart custom:showText="true" custom:labelPosition="left" /> </LinearLayout>
Aby uniknąć konieczności powtarzania identyfikatora URI długiej przestrzeni nazw, w przykładzie użyto atrybutu
dyrektywa xmlns
. Ta dyrektywa przypisuje alias custom
do:
przestrzeni nazw http://schemas.android.com/apk/res/com.example.customviews
.
Możesz wybrać dowolny alias dla swojej przestrzeni nazw.
Zwróć uwagę na nazwę tagu XML, który dodaje widok niestandardowy do układu. Jest to pełne
kwalifikowana nazwa
klasę widoku niestandardowego. Jeśli Twoja klasa wyświetlania jest klasą wewnętrzną, możesz ją dodatkowo zakwalifikować
nazwą klasy zewnętrznej widoku.
Na przykład plik
Klasa PieChart
ma klasę wewnętrzną o nazwie PieView
. Aby użyć funkcji
atrybutów niestandardowych z tych zajęć,
użyj tagu com.example.customviews.charting.PieChart$PieView
.
Zastosuj atrybuty niestandardowe
W przypadku tworzenia widoku z układu XML odczytywane są wszystkie atrybuty w tagu XML.
z zasobu
i przekazywana do konstruktora widoku jako
AttributeSet
Chociaż jest to
można bezpośrednio odczytywać wartości z interfejsu AttributeSet
, wykonując w ten sposób
ma kilka wad:
- Odwołania do zasobów w wartościach atrybutów nie są rozpoznawane.
- Style nie zostały zastosowane.
Zamiast tego przekaż AttributeSet
do:
obtainStyledAttributes()
Ta metoda zwraca
TypedArray
tablica
które są
już usunięte z wyników wyszukiwania i określonego stylu.
Kompilator zasobów Androida wykonuje wiele pracy, aby wywoływać u Ciebie
obtainStyledAttributes()
. Za: <declare-styleable>
zasobu w katalogu res/
, wygenerowany R.java
definiuje zarówno tablicę atrybutu
identyfikatory i zbiór
stałe, które określają indeks każdego atrybutu w tablicy. Korzystasz ze wstępnie zdefiniowanego
stałe do odczytu
z tabeli TypedArray
. Aby to zrobić:
zajęcia PieChart
odczytuje jego atrybuty:
Kotlin
init { context.theme.obtainStyledAttributes( attrs, R.styleable.PieChart, 0, 0).apply { try { mShowText = getBoolean(R.styleable.PieChart_showText, false) textPos = getInteger(R.styleable.PieChart_labelPosition, 0) } finally { recycle() } } }
Java
public PieChart(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.PieChart, 0, 0); try { mShowText = a.getBoolean(R.styleable.PieChart_showText, false); textPos = a.getInteger(R.styleable.PieChart_labelPosition, 0); } finally { a.recycle(); } }
Pamiętaj, że obiekty TypedArray
są udostępniane
i należy poddać ją recyklingowi po użyciu.
Dodawanie usług i zdarzeń
Atrybuty to potężny sposób na kontrolowanie zachowania i wyglądu widoków, ale
mogą być tylko do odczytu
po zainicjowaniu widoku. Aby zapewnić dynamiczne zachowanie, udostępnij metodę pobierającą właściwości i
para ustawiająca dla każdej
atrybutu niestandardowego. Ten fragment kodu pokazuje, jak PieChart
udostępnia usługę
pod tytułem showText
:
Kotlin
fun isShowText(): Boolean { return mShowText } fun setShowText(showText: Boolean) { mShowText = showText invalidate() requestLayout() }
Java
public boolean isShowText() { return mShowText; } public void setShowText(boolean showText) { mShowText = showText; invalidate(); requestLayout(); }
Zwróć uwagę, że funkcja setShowText
wywołuje funkcję invalidate()
i requestLayout()
. Te połączenia są bardzo ważne
aby zapewnić prawidłowe działanie widoku. Potrzebujesz
unieważnia widok po każdej zmianie we właściwościach, która mogłaby zmienić
dzięki czemu
system rozpoznaje ich potrzebę ponownego utworzenia. Podobnie musisz zażądać nowego układu, jeśli
usługa zmienia się w sposób,
co może mieć wpływ na rozmiar lub kształt widoku. Zapomnienie tych wywołań metody może spowodować
trudno znaleźć
robaki.
Widoki niestandardowe muszą też obsługiwać detektory zdarzeń do przekazywania ważnych zdarzeń. Dla:
instancja, PieChart
udostępnia zdarzenie niestandardowe o nazwie OnCurrentItemChanged
, aby powiadamiać detektory, że
użytkownik obrócił
wykres kołowy, aby skupić się na nowym wycinku koła.
Możesz łatwo zapomnieć o udostępnieniu właściwości i zdarzeń, zwłaszcza gdy jesteś jedynym użytkownikiem od widoku niestandardowego. Poświęcenie czasu na dokładne zdefiniowanie interfejsu widoku ogranicza w przyszłości Warto przestrzegać zasad, aby zawsze ujawniać każdą właściwość, która ma wpływ na widoczne wygląd lub zachowanie do widoku niestandardowego.
Projektowanie z myślą o ułatwieniach dostępu
Widok niestandardowy musi obsługiwać szeroki zakres użytkowników. Obejmuje to użytkowników z niepełnosprawność, uniemożliwiać mu korzystanie z ekranu dotykowego. Aby pomóc użytkownikom z niepełnosprawnościami, wykonaj te czynności:
- Oznacz pola do wprowadzania danych za pomocą atrybutu
android:contentDescription
. - Wywołuj zdarzenia ułatwień dostępu, dzwoniąc pod numer
sendAccessibilityEvent()
w razie potrzeby. - Obsługa innych kontrolerów, takich jak pad kierunkowy lub kulka.
Więcej informacji o tworzeniu widoków ułatwień dostępu: Ułatwienia dostępu w aplikacjach