Настройка прокладки программно и через xml

Я создаю некоторые пользовательские компоненты, и я хотел бы иметь набор дополнений по умолчанию, но также иметь возможность настроить его через xml, если это необходимо.

Например:

Простой пользовательский компонент TextView с заполнением по умолчанию:

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

Затем этот компонент будет добавлен в приложение следующим образом:

 <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"/> 

Вопрос

Android в настоящее время игнорирует 32dp дополнений, установленных через xml, и идет с четырьмя dp дополнения, которые находятся в методе init компонента. Есть ли способ заставить Android использовать набор дополнений в xml, если он существует, и использовать заполнение по умолчанию, если в xml не указано такое дополнение?

Solutions Collecting From Web of "Настройка прокладки программно и через xml"

Вы можете использовать obtainStyledAttributes для извлечения атрибутов XML и hasValue чтобы проверить, есть ли атрибут в индексе.

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