Intereting Posts
Вывод типа компилятора Kotlin не может выбрать способ вызова (двусмысленность с типичными типами) делегировать вложенную закрытую закрытие соответствующего класса Kotlin: Как изменить значение в паре? Как я могу запускать файлы Kotlin-Script (.kts) из Kotlin / Java? Kotlin / Java, строковый массив еще не инициализирован при вызове метода Spring Security несколько успешных поставщиков аутентификации Добавить фрагмент во время выполнения с причинами Kotlin «К сожалению приложение остановилось» Разница между различными функциями verifySignatures в тестировании блока Corda Необходимо получить абсолютный путь к веб-странице с помощью Java Android Retrofit и GSON: ответ JSON возвращает объект или строку как значение свойства Каков самый ранний уровень API Android, с которым я могу использовать Kotlin? оператор 'when' пропускает условие в Kotlin для Android Являются ли числовые операции с использованием Kotlin столь же быстрыми, как эквивалент с Java-примитивами? «Невозможно преобразовать объект типа java.lang.String в тип com.android.projectrc.Listing» при использовании Firebase RecyclerAdapter Как передать аргументы в скрипт kotlin?

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