Android - benutzerdefinierte Benutzeroberfläche mit benutzerdefinierten Attributen

113

Ich weiß, dass es möglich ist, ein benutzerdefiniertes UI-Element zu erstellen (über View oder eine bestimmte UI-Elementerweiterung). Aber ist es möglich, neue Eigenschaften oder Attribute für neu erstellte UI-Elemente zu definieren (ich meine nicht geerbt, aber brandneu, um ein bestimmtes Verhalten zu definieren, das ich mit Standardeigenschaften oder Attributen nicht verarbeiten kann)?

zB Element mein benutzerdefiniertes Element:

<com.tryout.myCustomElement
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Element..."
   android:myCustomValue=<someValue>
/>

Ist es also möglich, MyCustomValue zu definieren ?

Vielen Dank

Wegpunkt
quelle
Hey hier hast du einen schönen Artikel über die benutzerdefinierten Attribute in Android - amcmobileware.org/android/blog/2016/09/11/custom-attributes
Arkadiusz Cieśliński
Schauen Sie sich meine Antwort auf diese verwandte Frage an.
Helios

Antworten:

258

Ja. Kurzanleitung:

1. Erstellen Sie ein Attribut XML

Erstellen Sie eine neue XML-Datei /res/values/attrs.xmlmit dem Attribut und dem Typ

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <declare-styleable name="MyCustomElement">
        <attr name="distanceExample" format="dimension"/>
    </declare-styleable>
</resources>

Grundsätzlich müssen Sie eine <declare-styleable />für Ihre Ansicht einrichten , die alle Ihre benutzerdefinierten Attribute enthält (hier nur eine). Ich habe nie eine vollständige Liste möglicher Typen gefunden, daher müssen Sie sich die Quelle für einen ansehen, denke ich. Ich kenne folgende Typen: Referenz (auf eine andere Ressource), Farbe, Boolescher Wert, Dimension, Float, Ganzzahl und Zeichenfolge . Sie sind ziemlich selbsterklärend

2. Verwenden Sie die Attribute in Ihrem Layout

Das funktioniert genauso wie oben, mit einer Ausnahme. Ihr benutzerdefiniertes Attribut benötigt einen eigenen XML-Namespace.

<com.example.yourpackage.MyCustomElement
   xmlns:customNS="http://schemas.android.com/apk/res/com.example.yourpackage"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Element..."
   customNS:distanceExample="12dp"
   />

Ziemlich einfach.

3. Verwenden Sie die Werte, die Sie übergeben bekommen

Ändern Sie den Konstruktor Ihrer benutzerdefinierten Ansicht, um die Werte zu analysieren.

public MyCustomElement(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyCustomElement, 0, 0);
    try {
        distanceExample = ta.getDimension(R.styleable.MyCustomElement_distanceExample, 100.0f);
    } finally {
        ta.recycle();
    }
    // ...
}

distanceExampleist in diesem Beispiel eine private Mitgliedsvariable. TypedArrayIch habe viele andere Dinge, um andere Arten von Werten zu analysieren.

Und das ist es. Verwenden Sie den analysierten Wert in Ihrem View, um ihn zu ändern, z. B. verwenden Sie ihn onDraw(), um das Aussehen entsprechend zu ändern.

uthark
quelle
7
Beachten Sie einfach TypedArray. Rufen Sie recycle () auf, wenn Sie damit fertig sind.
Zskalnik
Vervollständigt die IDE (z. B. Eclipse) die Schlüssel / Werte benutzerdefinierter Attribute automatisch?
AlikElzin-Kilaka
23
Für Gradle Builds sollten Sie verwenden, http://schemas.android.com/apk/res-autowenn Sie den benutzerdefinierten Namespace deklarieren
Dori
2
In Schritt 3 können Sie einfach verwenden, String initialText = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "initialText");wobei attr das AttributeSet ist, das im Konstruktor übergeben wird, und 'initialText' Ihr benutzerdefinierter Attributname ist
kosiara - Bartosz Kosarzycki
21

Erstellen Sie in Ihrem Ordner res / values ​​die Datei attr.xml. Dort können Sie Ihre Attribute definieren:

<declare-styleable name="">
    <attr name="myCustomValue" format="integer/boolean/whatever" />
</declare-styleable>

Wenn Sie es dann in Ihrer Layoutdatei verwenden möchten, müssen Sie hinzufügen

xmlns:customname="http://schemas.android.com/apk/res/your.package.name"

und dann können Sie den Wert mit verwenden customname:myCustomValue=""

Maria Neumayer
quelle
Dies ist nicht die Antwort, die Frage ist, wie man programmatisch von Java wechselt
Fazal
-11

Ja, Sie können. Verwenden Sie einfach <resource>Tag.
so was:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
    </style>
</resources>

Link von der offiziellen Website

Frank Cheng
quelle
Danke für die Antwort. Aber in der Ressource sehe ich die Verwendung von Standardwerten für "android:". Mein Punkt ist, kann ich zB android: phoneNameSelected = "true" als Parameter meines benutzerdefinierten UI-Elements haben?
Wegpunkt