2013-08-09 14 views
14

Da una vista, come posso ottenere il valore di Android: attributo padding a livello di codice? Attualmente sto usando:Ottieni Android: attributo padding programmatico

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

Ciò restituisce -1, ho anche provato con "android: padding", come il nome dell'attributo ma -1 è ancora tornato.

MODIFICA: Il mio requisito: quando un valore android: padding è specificato nell'XML del layout, la vista utilizzerà questo riempimento. Se una spaziatura non è specificata, verrà utilizzata una spaziatura predefinita

risposta

12

Il modo più semplice era utilizzare Android.R.styleable, se fosse stato disponibile. Allo stesso modo in cui usa per ottenere attributi personalizzati. R.styleable è una classe che contiene un int array di valori di attributi. Quindi è necessario creare il proprio array int, che contiene i valori int degli attributi di cui si ha bisogno.

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

Non è getPadding * () disponibile già nel costruttore? * in {sinistra, destra, alto, basso, inizio, fine} – milosmns

+0

Non dimenticare di rilasciare il TypedArray: arr.recycle(); – Eselfar

2

È necessario controllare le funzioni getPadding____().

Dimensione spaziature e margini

...

Per misurare le sue dimensioni, una vista tiene conto del suo riempimento. Il riempimento dello è espresso in pixel per le parti della vista a sinistra, in alto a destra e in basso a . Il riempimento può essere utilizzato per compensare il contenuto della vista di una quantità specifica di pixel. Ad esempio, una spaziatura a sinistra di 2 sposterà il contenuto della vista di 2 pixel a destra del margine sinistro di . Imbottitura può essere impostato utilizzando il setPadding (int, int, int, int) o il metodo setPaddingRelative (int, int, int, int) e interrogato chiamando getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom (), getPaddingStart(), getPaddingEnd().

Anche se una vista può definire un riempimento, non fornisce alcun supporto per i margini. Tuttavia, i gruppi di visualizzazione forniscono un tale supporto. Fare riferimento a ViewGroup e ViewGroup.MarginLayoutParams per ulteriori informazioni .

+0

Si prega di vedere la mia modifica, ho bisogno del valore dell'attributo, non l'imbottitura –

4

È possibile aggiungere lo android:padding agli attributi della vista personalizzata.

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

E poi, è possibile accedere l'attributo, proprio come gli altri attributi:

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

È davvero corretto aggiungere un attributo 'android:' prefisso ad una vista personalizzata? – milosmns

Problemi correlati