Применить стиль к MaterialButton программно - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь создать пользовательское представление, расширяющееся от MaterialButton, и применить стиль в коде, поэтому мне не нужно делать это в xml.

class CustomRedButton @JvmOverloads constructor(
    context: Context, 
    attrs: AttributeSet? = null, 
    defStyleAttr: Int = 0
) : MaterialButton(ContextThemeWrapper(context, R.style.ButtonRedStyle), attrs, defStyleAttr) 

Стиль:

<style name="ButtonRedStyle" 
    parent="Widget.MaterialComponents.Button.TextButton">
    <item name="backgroundTint">@color/red</item>
    <item name="rippleColor">@color/grey</item>
    <item name="strokeWidth">1dp</item>
    <item name="strokeColor">@color/black</item>
</style>

Все отлично работает, но backgroundTint свойство.По какой-то причине цвет фона не меняется, и он имеет основной цвет Темы.Однако, если я попытаюсь применить стиль к MaterialButton в xml, он изменит цвет.

Есть идеи, почему это может происходить или как я могу этого достичь?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

У меня тоже такая же проблема.Единственный обходной путь, который я нашел, - это программно установить оттенок:

button.setBackgroundTintList(ColorStateList.valueOf(Color.RED));
0 голосов
/ 19 сентября 2018

Если вы хотите изменить свой стиль на CustomView, вы должны передать его конструктору, передав его в третий параметр defStyleAttr следующим образом:

class CustomRedButton @JvmOverloads constructor(
    context: Context, 
    attrs: AttributeSet? = null, 
    defStyleAttr: Int = R.style.ButtonRedStyle // Just default style like this
) : MaterialButton(context, attrs, defStyleAttr)

, и вы можете инициализировать его программно следующим образом:

CustomRedButton(this, null, R.style.ButtonRedStyle) // Initialization, ('this' is context)

Для получения более подробной информации см. здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...