Was ist AttributeSet und wie kann ich es verwenden?

75

Was ist AttributeSet in Android?

Wie kann ich es für meine benutzerdefinierte Ansicht verwenden?

Premier
quelle
2
@oae, dass Link gebrochen ist
Supuhstar

Antworten:

25

Eine späte Antwort, obwohl eine detaillierte Beschreibung, für andere.

AttributeSet (Android Docs)

Eine Sammlung von Attributen, die einem Tag in einem XML-Dokument zugeordnet sind.

Grundsätzlich können Sie dies tun, wenn Sie versuchen, eine benutzerdefinierte Ansicht zu erstellen, und Werte wie Abmessungen, Farben usw. übergeben möchten AttributeSet.

Hier ist ein Beispiel

Stellen Sie sich vor, Sie möchten Viewunten ein "Gefällt mir" erstellen

Geben Sie hier die Bildbeschreibung ein

Es gibt ein Rechteck mit gelbem Hintergrund und einen Kreis mit einem Radius von beispielsweise 5 dp und grünem Hintergrund. Wenn Sie möchten, dass Ihre Ansichten die Werte der Hintergrundfarben und des Radius über XML wie folgt übernehmen:

<com.anjithsasindran.RectangleView
    app:radiusDimen="5dp"
    app:rectangleBackground="@color/yellow"
    app:circleBackground="@color/green" />

Nun, dort AttributeSetwird es verwendet. Sie können diese Datei attrs.xmlim Werteordner mit den folgenden Eigenschaften haben.

<declare-styleable name="RectangleViewAttrs">
    <attr name="rectangle_background" format="color" />
    <attr name="circle_background" format="color" />
    <attr name="radius_dimen" format="dimension" />
</declare-styleable>

Da dies eine Ansicht ist, erstreckt sich die Java-Klasse von View

public class RectangleView extends View {

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

        TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.RectangleViewAttrs);
        mRadiusHeight = attributes.getDimensionPixelSize(R.styleable.RectangleViewAttrs_radius_dimen, getDimensionInPixel(50));
        mCircleBackgroundColor = attributes.getDimensionPixelSize(R.styleable.RectangleViewAttrs_circle_background, getDimensionInPixel(20));
        mRectangleBackgroundColor = attributes.getColor(R.styleable.RectangleViewAttrs_rectangle_background, Color.BLACK);
        attributes.recycle()
    }
}

Jetzt können wir diese Eigenschaften für unser RectangleViewXML-Layout verwenden und diese Werte im RectangleViewKonstruktor abrufen .

app:radius_dimen
app:circle_background
app:rectangle_background
capt.swag
quelle
2
Warum haben Sie einen ganzzahligen Wert in angegeben getDimensionInPixel(50)?
Daksh Gargas
2
Vielen Dank für die schöne Antwort, es kann leicht verständlich sein. Um diese Antwort beizutragen, müssen Sie eine kleine Information geben, die nützlicher ist. Recyceln Sie das TypedArray, nachdem Sie dies getan haben. Dadurch kann es von einem späteren Anrufer wiederverwendet werden.
Muhammed Yalçın Kuru
@ MuhammedYalçınKuru Guter Vorschlag, ich habe die Änderung vorgenommen.
capt.swag
9

Mit AttributeSet können Sie zusätzliche benutzerdefinierte Werte für Ihre Ansicht abrufen, die Sie in der XML definieren. Zum Beispiel. Es gibt ein Tutorial zum Definieren von benutzerdefinierten Attributen, in dem es heißt: "Es ist möglich, Werte direkt aus dem AttributeSet zu lesen." Es warnt jedoch davor, dass wenn Sie keine gestalteten Attribute verwenden, dann:

  • Ressourcenreferenzen innerhalb von Attributwerten werden nicht aufgelöst
  • Stile werden nicht angewendet

Wenn Sie das gesamte gestaltete Attribut ignorieren und die Attribute direkt abrufen möchten:

example.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:custom="http://www.chooseanything.org">

  <com.example.CustomTextView
    android:text="Blah blah blah"
    custom:myvalue="I like cheese"/>

</LinearLayout>

Beachten Sie, dass es zwei Zeilen mit xmlns gibt (xmlns = XML-Namespace), die zweite ist als xmlns definiert: custom. Dann wird unter diesem Brauch: myvalue definiert.

CustomTextView.java

public CustomTextView( Context context, AttributeSet attrs )
{
  super( context, attrs );
  String sMyValue = attrs.getAttributeValue( "http://www.chooseanything.org", "myvalue" );
  // Do something useful with sMyValue
}
Dave
quelle
6

AttributeSet ist der Satz von Eigenschaften, die in einer XML-Ressourcendatei angegeben sind. Sie sollten in Ihrer benutzerdefinierten Ansicht nichts Besonderes tun müssen. Der View(Context context, AttributeSet attrs)wird aufgerufen, um eine Ansicht aus einer Layoutdatei zu initialisieren. Fügen Sie diesen Konstruktor einfach Ihrer benutzerdefinierten Ansicht hinzu. Sehen Sie sich das Beispiel für die benutzerdefinierte Ansicht im SDK an, um zu sehen, ob es verwendet wird.

Robby Pond
quelle
1
Ich bin mir nicht sicher, ob die Beispiellinks jemals die tatsächlichen Beispiele gezeigt haben, aber sie leiten immer auf dieselbe Seite weiter. Ich beziehe mich immer auf dasselbe Beispiel aus dem Beispielordner im SDK. Zum Beispiel ist das oben zitierte Beispiel im Ordnerandroid-sdk\samples\android-17\ApiDemos\src\com\example\android\apis\view
Sundeep
0

Wenn eine Ansicht aus einem XML-Layout erstellt wird, werden alle Attribute im XML-Tag aus dem Ressourcenpaket gelesen und als Konstruktor an den Konstruktor der Ansicht übergeben AttributeSet

Obwohl es möglich ist, Werte AttributeSetdirekt aus dem zu lesen , hat dies einige Nachteile:

  • Ressourcenreferenz innerhalb von Attributwerten wird nicht aufgelöst
  • Stile werden nicht angewendet

Gehen Sie stattdessen AttributeSetzu obtainStyledAttribute(). Diese Methode gibt ein TypedArrayArray von Werten zurück, die verzögert und formatiert wurden.

Daksh Gargas
quelle