Was ist AttributeSet in Android?
Wie kann ich es für meine benutzerdefinierte Ansicht verwenden?
Antworten:
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
.
Stellen Sie sich vor, Sie möchten View
unten ein "Gefällt mir" erstellen
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 AttributeSet
wird es verwendet. Sie können diese Datei attrs.xml
im 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 RectangleView
XML-Layout verwenden und diese Werte im RectangleView
Konstruktor abrufen .
app:radius_dimen
app:circle_background
app:rectangle_background
getDimensionInPixel(50)
?
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:
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
}
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.
android-sdk\samples\android-17\ApiDemos\src\com\example\android\apis\view
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 AttributeSet
direkt aus dem zu lesen , hat dies einige Nachteile:
Gehen Sie stattdessen AttributeSet
zu obtainStyledAttribute()
. Diese Methode gibt ein TypedArray
Array von Werten zurück, die verzögert und formatiert wurden.