2013-08-09 18 views
14

Aus einer Sicht, wie kann ich den Wert des Android: Padding-Attribut programmgesteuert erhalten? Ich bin derzeit:Get Android: Padding-Attribut programmgesteuert

private static final String ANDROID_NAMESPACE = "http://schemas.android.com/apk/res/android"; 
private static final String ATTRIBUTE_PADDING = "padding"; 

public ActivityWrapperView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    int padding = attrs.getAttributeIntValue(ANDROID_NAMESPACE, ATTRIBUTE_PADDING, -1); 
} 

Diese -1 zurück, ich habe auch versucht, mit „android: padding“ als Attribut Name, aber -1 noch zurückgegeben.

BEARBEITEN: Meine Anforderung: Wenn ein android: padding-Wert im Layout-XML angegeben ist, verwendet die Ansicht dieses Padding. Wenn kein Padding angegeben ist, wird ein Standard-Padding verwendet.

Antwort

12

Der einfachste Weg war, android.R.styleable zu verwenden, wenn es verfügbar gewesen wäre. Genauso, wie benutzerdefinierte Attribute abgerufen werden. R.styleable ist eine Klasse, die ein int-Array von Attributwerten enthält. Sie müssen also Ihr eigenes int-Array erstellen, das int-Werte von Attributen enthält, die Sie benötigen.

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

    //check attributes you need, for example all paddings 
    int [] attributes = new int [] {android.R.attr.paddingLeft, android.R.attr.paddingTop, android.R.attr.paddingBottom, android.R.attr.paddingRight} 

    //then obtain typed array 
    TypedArray arr = context.obtainStyledAttributes(attrs, attributes); 

    //and get values you need by indexes from your array attributes defined above 
    int leftPadding = arr.getDimensionPixelOffset(0, -1); 
    int topPadding = arr.getDimensionPixelOffset(1, -1); 

    //You can check if attribute exists (in this examle checking paddingRight) 
    int paddingRight = arr.hasValue(3) ? arr.getDimensionPixelOffset(3, -1) : myDefaultPaddingRight; 


} 
+3

Ist getPadding nicht * () schon im Konstruktor verfügbar? * in {Links, Rechts, Oben, Unten, Anfang, Ende} – milosmns

+0

Vergessen Sie nicht, das TypedArray loszulassen: arr.recycle(); – Eselfar

2

Sie sollten sich die getPadding____() Funktionen ansehen.

Größe, Polsterung und Margen

...

seine Dimensionen zu messen, eine Ansicht berücksichtigt seine Polsterung. Die Auffüllung wird in Pixeln für die linken, oberen, rechten und unteren Teile der Ansicht ausgedrückt. Padding kann verwendet werden, um den Inhalt der Ansicht um eine bestimmte Anzahl von Pixeln zu versetzen. Ein linker Padding von 2 verschiebt beispielsweise den Inhalt der Ansicht um 2 Pixel nach rechts von der linken Kante der Kante. Padding können die setPadding eingestellt werden (int, int, int, int) oder setPaddingRelative (int, int, int, int) Verfahren und abgefragt durch getPaddingLeft() aufrufen, getPaddingTop(), getPaddingRight(), getPaddingBottom (), getPaddingStart(), getPaddingEnd().

Obwohl eine Ansicht eine Auffüllung definieren kann, bietet sie keine Unterstützung für Ränder. View-Gruppen bieten jedoch eine solche Unterstützung. Weitere Informationen finden Sie unter ViewGroup und ViewGroup.MarginLayoutParams für weitere Informationen.

+0

Sehen Sie bitte meine bearbeiten, muss ich den Wert des Attributs, nicht die Polsterung –

4

können Sie nur die android:padding zu Ihrer benutzerdefinierten Ansicht Attribute hinzufügen.

<declare-styleable name="ActivityWrapperView"> 
    ... 
    <attr name="android:padding" /> 
    ... 
</declare-styleable> 

Und dann können Sie das Attribut genau wie Ihre anderen Attribute zugreifen:

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ActivityWrapperView); 
float padding = a.getDimension(R.styleable.ActivityWrapperView_android_padding, 0); 
... 
boolean hasPadding = a.hasValue(R.styleable.ActivityWrapperView_android_padding); 
+0

Ist es wirklich in Ordnung, einer benutzerdefinierten Ansicht ein 'android:' Präfix-Attribut hinzuzufügen? – milosmns

Verwandte Themen