Tworzenie zajęć w widoku danych

Wypróbuj sposób tworzenia wiadomości
Jetpack Compose to zalecany zestaw narzędzi UI na Androida. Dowiedz się, jak korzystać z układów w funkcji Utwórz

Dobrze zaprojektowany widok niestandardowy jest jak inne dobrze zaprojektowane zajęcia. Obejmuje określony zestaw funkcji z prostym interfejsem, wydajnie korzysta z procesora i pamięci itd. Poza tym, że klasa jest dobrze zaprojektowana, 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 tagi XML, które ułatwiają utworzenie widoku spełniającego wszystkie te wymagania. Z tej lekcji dowiesz się, jak za pomocą platformy Androida utworzyć główną funkcjonalność klasy widoku.

Więcej informacji znajdziesz w artykule Komponenty widoku niestandardowego.

Podklasy widoku danych

Wszystkie klasy widoku zdefiniowane na platformie Androida rozszerzają zasób View. Możesz również rozszerzyć widok niestandardowy bezpośrednio na View lub zaoszczędzić czas przez rozszerzenie jednej z istniejących podklas widoku, takiej jak Button.

Aby umożliwić Android Studio interakcję z widokiem, musisz udostępnić co najmniej konstruktor, który jako parametry przyjmuje obiekty Context i AttributeSet. 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, określ go w elemencie XML i kontroluj jego wygląd oraz działanie za pomocą atrybutów elementów. Widoki niestandardowe możesz też dodawać i określać ich styl za pomocą kodu XML. Aby włączyć tę funkcję w widoku niestandardowym:

  • 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 pobieranie i stosowanie wartości w czasie działania.

Aby zdefiniować atrybuty niestandardowe, dodaj do projektu zasoby (<declare-styleable> ). W pliku res/values/attrs.xml zazwyczaj umieszcza się te zasoby. 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 2 atrybuty niestandardowe (showText i labelPosition), które należą do elementu z możliwością stylizacji o nazwie PieChart. Nazwa elementu z możliwością stylów to zgodnie z konwencją ta sama nazwa co nazwa klasy definiującej widok niestandardowy. Chociaż nie jest konieczne przestrzeganie tej konwencji, wiele popularnych edytorów kodu używa tej konwencji nazewnictwa, aby zapewnić uzupełnianie instrukcji.

Po zdefiniowaniu atrybutów niestandardowych możesz ich używać w plikach XML układu tak samo jak w atrybutach wbudowanych. Jedyną różnicą jest to, że atrybuty niestandardowe należą do innej przestrzeni nazw. Należą one do http://schemas.android.com/apk/res/[your package name], a nie do przestrzeni nazw http://schemas.android.com/apk/res/android. Aby na przykład użyć atrybutów zdefiniowanych 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ąć powtarzania identyfikatora URI długiego obszaru nazw, w przykładzie zastosowano dyrektywę xmlns. Ta dyrektywa powoduje przypisanie aliasu 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łna i jednoznaczna nazwa klasy widoku niestandardowego. Jeśli klasa widoku jest klasą wewnętrzną, możesz ją dodatkowo zakwalifikować na podstawie nazwy klasy zewnętrznej widoku. Na przykład klasa PieChart ma klasę wewnętrzną o nazwie PieView. Aby użyć atrybutów niestandardowych z tej klasy, użyj tagu com.example.customviews.charting.PieChart$PieView.

Zastosuj atrybuty niestandardowe

W przypadku tworzenia widoku z układu XML wszystkie atrybuty w tagu XML są odczytywane z pakietu zasobów i przekazywane do konstruktora widoku jako AttributeSet. Wartości z AttributeSet można odczytać bezpośrednio, ale ma to pewne wady:

  • Odwołania do zasobów w wartościach atrybutów nie są rozpoznawane.
  • Style nie zostały zastosowane.

Zamiast tego przekaż AttributeSet użytkownikowi obtainStyledAttributes(). Ta metoda zwraca tablicę wartości TypedArray, do których już się odwołujesz i do których zastosowano styl.

Kompilator zasobów Androida wykonuje mnóstwo pracy, aby ułatwić wywoływanie funkcji obtainStyledAttributes(). Dla każdego zasobu <declare-styleable> w katalogu res/ wygenerowany R.java definiuje tablicę identyfikatorów atrybutów i zbiór stałych, które określają indeks każdego atrybutu w tablicy. Do odczytywania atrybutów z TypedArray używasz wstępnie zdefiniowanych stałych. Oto jak klasa PieChart odczytuje swoje 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ą współużytkowanym zasobem i muszą zostać poddane recyklingowi po użyciu.

Dodawanie usług i zdarzeń

Atrybuty to skuteczny sposób kontrolowania działania i wyglądu widoków, ale można je odczytać tylko po zainicjowaniu widoku. Aby zapewnić dynamiczne zachowanie, dla każdego atrybutu niestandardowego udostępnij parę pobierającą i ustawiającą właściwości. Ten fragment kodu pokazuje, jak PieChart udostępnia usługę o nazwie 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 invalidate() i requestLayout(). Wywołania te mają kluczowe znaczenie dla prawidłowego działania widoku. Po wprowadzeniu zmian we właściwościach, które mogą zmienić wygląd, unieważnij widok, aby system wiedział, że trzeba go ponownie narysować. Tak samo musisz zażądać nowego układu, jeśli usługa zmieni się w sposób, który może wpłynąć na rozmiar lub kształt widoku. Zapominanie o tych wywołaniach może spowodować trudne do znalezienia błędy.

Widoki niestandardowe muszą też obsługiwać detektory zdarzeń do przekazywania ważnych zdarzeń. Na przykład PieChart udostępnia zdarzenie niestandardowe o nazwie OnCurrentItemChanged, aby powiadamiać detektorów, ż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 jeśli jesteś jedynym użytkownikiem widoku niestandardowego. Poświęcenie czasu na dokładne zdefiniowanie interfejsu widoku zmniejsza przyszłe koszty konserwacji. Zalecamy, aby zawsze ujawniać każdą właściwość, która wpływa na widoczny wygląd lub działanie widoku niestandardowego.

Projektowanie z myślą o ułatwieniach dostępu

Widok niestandardowy musi obsługiwać szeroki zakres użytkowników. Dotyczy to także użytkowników z niepełnosprawnościami, którzy nie mogą zobaczyć lub korzystać z ekranu dotykowego. Aby pomóc użytkownikom z niepełnosprawnościami:

  • Oznacz pola do wprowadzania danych za pomocą atrybutu android:contentDescription.
  • Wysyłaj zdarzenia ułatwień dostępu, wywołując w razie potrzeby funkcję sendAccessibilityEvent().
  • Obsługa innych kontrolerów, takich jak pad kierunkowy lub kulka.

Więcej informacji o tworzeniu widoków ułatwień dostępu znajdziesz w artykule o ułatwianiu dostępu do aplikacji.