Я создаю некоторые пользовательские компоненты, и я хотел бы иметь набор дополнений по умолчанию, но также иметь возможность настроить его через 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 не указано такое дополнение?
Вы можете использовать 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() }