Я пытался найти решение, пока был ответ, но его нет. По крайней мере, нет, если вы хотите определить стиль кнопок глобально, как вы это сделали в своем вопросе.
Проблема в следующем: как вы, вероятно, знаете, LayoutParams привязаны к определенному типу c ViewGroup (например, LinearLayout или FrameLayout). Это вызывает следующую проблему: Вы определили layout_margin
в своем стиле, который применяется глобально vai materialButtonStyle
. Однако для применения этого атрибута (и любого атрибута макета) родительский элемент представления должен быть известен. Вот почему установка style="@style/TempButtonStyle"
действительно работает.
Итак, какой самый простой способ исправить это?
Я знаю, что это не идеально, но расширение MaterialButton и установка полей программно - это способ чтобы справиться с этим:
Просто переопределите onMeasure и внутри него сделайте следующее (после супервызова):
MarginLayoutParams::class.java.cast(layoutParams)?.apply {
topMargin = 30
bottomMargin = 30
leftMargin = 30
rightMargin = 30
layoutParams = this
}
Или Java:
MarginLayoutParams margins = MarginLayoutParams.class.cast(getLayoutParams());
margins.topMargin = 30;
margins.bottomMargin = 30;
margins.leftMargin = 30;
margins.rightMargin = 30;
setLayoutParams(margins);
( конечно, вы не хотите использовать жестко запрограммированное значение и получать 10dp либо из определенного измерения, либо с помощью typedvalue)