Ansichtsklasse erstellen

Schreiben Sie jetzt
Jetpack Compose ist das empfohlene UI-Toolkit für Android. Hier erfahren Sie, wie Sie in „Compose“ mit Layouts arbeiten.

Eine gut durchdachte benutzerdefinierte Ansicht ist wie jede andere gut gestaltete Klasse. Es enthält eine bestimmte Gruppe von Funktionen mit einer einfachen Benutzeroberfläche, effiziente Nutzung von CPU und Arbeitsspeicher usw. In ist nicht nur ein erfüllt, muss eine benutzerdefinierte Ansicht folgende Anforderungen erfüllen:

  • Es muss den Android-Standards entsprechen.
  • Geben Sie benutzerdefinierte, anpassbare Attribute an, die mit Android-XML-Layouts funktionieren.
  • Bedienungshilfen-Ereignisse senden.
  • Sie muss mit mehreren Android-Plattformen kompatibel sein.

Das Android-Framework bietet eine Reihe von Basisklassen und XML-Tags, mit denen Sie eine Ansicht erstellen können, erfüllt alle diese Anforderungen. In dieser Lektion erfahren Sie, wie Sie mithilfe des Android-Frameworks Funktionalität einer Ansicht .

Weitere Komponenten einer benutzerdefinierten Ansicht.

Abgeleitete Klassen einer Ansicht erstellen

Alle im Android-Framework definierten Ansichtsklassen View Ihr kann die benutzerdefinierte Ansicht auch erweitern Sie View direkt oder Sie können um Zeit zu sparen, indem Sie eine der bestehende Ansicht abgeleiteten Klassen wie Button.

Damit Android Studio mit Ihrer Ansicht interagieren kann, müssen Sie mindestens einen Konstruktor bereitstellen, der eine Context und ein AttributeSet-Objekt als Parameter. Mit diesem Konstruktor kann der Layout-Editor eine Instanz Ihrer Ansicht erstellen und bearbeiten.

Kotlin

class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs)

Java

class PieChart extends View {
    public PieChart(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}

Benutzerdefinierte Attribute definieren

Wenn du deiner Benutzeroberfläche eine integrierte View hinzufügen möchtest, gib sie in einem XML-Element an und seine Darstellung und Verhalten mit Elementattributen. Sie können auch benutzerdefinierte Ansichten mithilfe von XML abrufen. Bis So aktivieren Sie dieses Verhalten in Ihrer benutzerdefinierten Ansicht:

  • Definieren Sie in einem <declare-styleable> -Ressourcenelement benutzerdefinierte Attribute für Ihre Ansicht.
  • Geben Sie Werte für die Attribute in Ihrem XML-Layout an.
  • Attributwerte zur Laufzeit abrufen
  • Wenden Sie die abgerufenen Attributwerte auf Ihre Ansicht an.

In diesem Abschnitt wird erläutert, wie Sie benutzerdefinierte Attribute definieren und ihre Werte angeben. Im nächsten Abschnitt geht es um Abrufen und Anwenden der Werte zur Laufzeit.

Fügen Sie Ihrem Projekt <declare-styleable> -Ressourcen hinzu, um benutzerdefinierte Attribute zu definieren. Es ist üblich, diese Ressourcen in einem res/values/attrs.xml-Datei. Hier finden Sie Beispiel für eine attrs.xml-Datei:

<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>

Mit diesem Code werden die beiden benutzerdefinierten Attribute showText und labelPosition deklariert. die zu einem stilsicheren Entität mit dem Namen PieChart. Der Name des formatierbaren Elements lautet üblicherweise der gleiche Name der Klasse zum Definieren der benutzerdefinierten Ansicht. Auch wenn es nicht notwendig ist, diese Konvention zu befolgen, Viele beliebte Codes -Editoren benötigen diese Namenskonvention, um Anweisungen zu vervollständigen.

Sobald Sie benutzerdefinierte Attribute definiert haben, können Sie sie wie integrierte Attribute. Die einzige der Unterschied besteht darin, dass Ihre benutzerdefinierten Attribute zu einem anderen Namespace gehören. Anstelle des Zugehörigkeitsgefühls zum Namespace http://schemas.android.com/apk/res/android gehören, gehören sie zu http://schemas.android.com/apk/res/[your package name]. So verwenden Sie zum Beispiel die Attribute definiert für 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>

Damit der lange Namespace-URI nicht wiederholt werden muss, wird im Beispiel ein xmlns-Anweisung. Durch diese Anweisung wird der Alias custom Namespace http://schemas.android.com/apk/res/com.example.customviews Sie können einen beliebigen Alias für den Namespace auswählen.

Beachten Sie den Namen des XML-Tags, mit dem die benutzerdefinierte Ansicht zum Layout hinzugefügt wird. Dabei handelt es sich um die den qualifizierten Namen des benutzerdefinierte Ansichtsklasse. Wenn es sich bei Ihrer View-Klasse um eine innere Klasse handelt, qualifizieren Sie sie weiter. durch den Namen der äußeren Klasse der Ansicht. Zum Beispiel Die Klasse PieChart hat eine innere Klasse namens PieView. So verwenden Sie die aus dieser Klasse erstellt haben, verwenden Sie das Tag com.example.customviews.charting.PieChart$PieView.

Benutzerdefinierte Attribute anwenden

Wenn eine Ansicht aus einem XML-Layout erstellt wird, werden alle Attribute im XML-Tag gelesen. aus der Ressource gebündelt und als Ansichtskonstruktor übergeben werden. AttributeSet Obwohl es Werte direkt aus AttributeSet zu lesen, hat einige Nachteile:

  • Ressourcenverweise innerhalb von Attributwerten werden nicht aufgelöst.
  • Stile werden nicht angewendet.

Übergeben Sie stattdessen AttributeSet an obtainStyledAttributes(). Bei dieser Methode wird ein TypedArray Array von Werte, die bereits dereferenziert und formatiert.

Der Android-Ressourcen-Compiler erledigt eine Menge Arbeit für Sie, damit obtainStyledAttributes() einfacher zu machen. Pro <declare-styleable> Ressource im Verzeichnis res/ definiert, definiert die generierte R.java sowohl ein Array von Attributen IDs und eine Reihe von Konstanten, die den Index für jedes Attribut im Array definieren. Sie verwenden die vordefinierten zu lesende Konstanten Attribute aus TypedArray Und so gehts Klasse PieChart liest seine Attribute:

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();
   }
}

Beachten Sie, dass TypedArray-Objekte sind eine freigegebene Ressource und müssen nach der Verwendung recycelt werden.

Attribute und Ereignisse hinzufügen

Mit Attributen können Sie Verhalten und Darstellung von Ansichten auf effektive Weise steuern. sie können nur gelesen werden Wenn die Ansicht initialisiert wird. Für ein dynamisches Verhalten geben Sie einen Eigenschafts-Getter und Setter-Paar für jede benutzerdefiniertes Attribut. Das folgende Snippet zeigt, wie PieChart eine Property freigibt mit dem Namen 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();
}

Beachten Sie, dass setShowText invalidate() aufruft. und requestLayout(). Diese Anrufe sind entscheidend, damit die Ansicht zuverlässig funktioniert. Du brauchst , um die Ansicht nach jeder Änderung an ihren Eigenschaften, die möglicherweise ihre Erscheinungsbild, sodass das das System erkennt, dass es neu gezeichnet werden muss. Ebenso müssen Sie ein neues Layout anfordern, dass sich eine Eigenschaft so ändert, die sich auf die Größe oder Form der Ansicht auswirken könnten. Wenn Sie diese Methodenaufrufe vergessen, schwer zu finden Bugs.

Benutzerdefinierte Ansichten müssen außerdem Ereignis-Listener unterstützen, damit wichtige Ereignisse kommunizieren können. Für Instanz, PieChart ein benutzerdefiniertes Ereignis namens OnCurrentItemChanged verfügbar macht, um Listener zu benachrichtigen, hat die nutzende Person die Kreisdiagramm, um sich auf ein neues Kreissegment zu konzentrieren.

Man vergisst leicht, Eigenschaften und Ereignisse sichtbar zu machen, insbesondere wenn Sie der einzige Nutzer sind der benutzerdefinierten Ansicht. Wenn Sie sich die Zeit nehmen, die Oberfläche Ihrer Ansicht sorgfältig zu definieren, reduziert sich der Wartungsaufwand. Kosten. Es empfiehlt sich, stets alle Eigenschaften sichtbar zu machen, Aussehen oder Verhalten von Ihrer benutzerdefinierten Ansicht.

Barrierefreies Design

Ihre benutzerdefinierte Ansicht muss eine große Bandbreite von Nutzern unterstützen. Dazu gehören Nutzer mit Beeinträchtigungen, die und daran hindern, einen Touchscreen zu sehen oder zu verwenden. Um Nutzende mit Beeinträchtigungen zu unterstützen, Gehen Sie so vor:

  • Beschriften Sie Ihre Eingabefelder mithilfe der android:contentDescription .
  • Bedienungshilfen-Ereignisse durch Aufrufen von sendAccessibilityEvent() senden wenn es angebracht ist.
  • Sie können alternative Controller wie ein Steuerkreuz oder einen Trackball unterstützen.

Weitere Informationen zum Erstellen barrierefreier Ansichten finden Sie unter <ph type="x-smartling-placeholder"></ph> Apps barrierefrei gestalten