2017-12-22 12 views
0

Ich erstelle einige benutzerdefinierte Komponenten und ich hätte gerne eine Standard-Padding-Set, aber auch in der Lage, es über XML zu konfigurieren, wenn dies gewünscht wird.Poser programmgesteuert setzen und durch xml

Zum Beispiel:

Einfache benutzerdefinierte Textview-Komponente mit Standard-padding:

class MyComponent @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : TextView(context, attrs, defStyle) { 

init { 
     layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) 

     val verticalPadding = resources.getDimension(R.dimen.FourDp).toInt() 
     val horizontalPadding = resources.getDimension(R.dimen.FourDp).toInt() 
     setPadding(horizontalPadding, verticalPadding, horizontalPadding, verticalPadding) 
    } 
} 

Diese Komponente würde dann in die App als fallen gelassen werden:

<com.example.components.MyComponent 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="padding test" 
        <!-- setting padding is optional --> 
        android:paddingTop="32dp"/> 

Die Frage

Android ignoriert derzeit die 32dp-Füllung, die durch xml gesetzt wurde, und geht mit den vier dp der Auffüllung, die in der init-Methode der Komponente ist. Gibt es eine Möglichkeit, dass ich Android dazu bringen kann, das in xml festgelegte Padding zu verwenden, wenn es existiert, und das Standard-Padding zu verwenden, wenn in xml kein solches Padding angegeben ist?

Antwort

1

Sie können obtainStyledAttributes verwenden, um XML-Attribute abzurufen, und hasValue, um zu überprüfen, ob ein Attribut im Index vorhanden ist.

init { 
    layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) 

    val verticalPadding = resources.getDimension(R.dimen.FourDp).toInt() 
    val horizontalPadding = resources.getDimension(R.dimen.FourDp).toInt() 

    val attributes = intArrayOf(android.R.attr.paddingLeft, android.R.attr.paddingTop, 
     android.R.attr.paddingBottom, android.R.attr.paddingRight) 

    val arr = context.obtainStyledAttributes(attrs, attributes) 

    // determine if paddingTop is set if not, use verticalPadding 
    val paddingRight = if (arr.hasValue(android.R.attr.paddingTop)) 
    arr.getDimensionPixelOffset(android.R.attr.paddingTop, -1) 
    else 
    verticalPadding 

    // setPadding 

    arr.recycle() 
} 
Verwandte Themen