Настройка прокладки программно и через 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 не указано такое дополнение?

Вы можете использовать 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() } 
Intereting Posts
Библиотека «Столкновение с пространством» вылетает со смертельным исходом 11 (SIGEGV) при вставке и удалении Как использовать библиотеку androidannotations в kotlin? Как проверить состояние, как i <J in for loop kotlin Использование сокета для пользовательского протокола через tcp Как преобразовать const char * в KString в Kotlin / Native? Возможно ли распространять список внутри списка в Котлине? Правила ProGuard для отражения Котлина Простой пример kotlin печатает kotlin.Unit при печати результата функции infix Создание нового каталога с использованием Kotlin, Mkdir () не работает Имеет ли Kotlin стандартный способ форматирования числа в качестве английского ординала? Метод вызова в родовом классе через отражение Внедрение в Kotlin – метод Значение по умолчанию Kotlin прямой доступ к Button в android.support.v4.app.Fragment ссылка на нулевой объект Kotlin Ktor не может получать данные с данными о местоположении OkHttp CookieJar не может добавить cookie для запроса