Android Custom View

Реализовываю возможность изменения темы динамически, Для этого нужно реализовать custom View.

Например button

data class

data class ButtonTheme (
    @ColorRes
    val textColor: Int,
    @ColorRes
    val color: Int,
    @StyleRes
    val style: Int
    //Что для стилей выбирать?
)

Theme

enum class Theme(
    val buttonTheme: ButtonTheme
){
    DARK(
        buttonTheme = ButtonTheme(
            color = android.R.color.holo_blue_bright,
            textColor = android.R.color.white,
            style =
        )

    ),

    LIGHT(
        buttonTheme = ButtonTheme(
            color = android.R.color.holo_orange_dark,
            textColor = android.R.color.black
        )
    )
}

button

class MyButton
@JvmOverloads
constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : AppCompatButton(context, attrs, defStyleAttr), ThemeManager.ThemeChangedListener {

    override fun onFinishInflate() {
        super.onFinishInflate()
        ThemeManager.addListener(this)
    }

    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        ThemeManager.addListener(this)
    }

    override fun onDetachedFromWindow() {
        super.onDetachedFromWindow()
        ThemeManager.removeListener(this)
    }

    override fun onThemeChanged(theme: Theme) {
        setTextColor(
            ContextCompat.getColor(context, theme.buttonTheme.textColor)
        )
        setBackgroundColor(ContextCompat.getColor(context, theme.buttonTheme.color)
        )





    }
}

Вопрос: по коду видно, что я беру android-вские цвета. Как мне достучаться до своих, объявленные в res/colors?

Update Я хочу, чтобы Button использовал Material Style

<style name="Login.Button.Outlined" parent="Widget.MaterialComponents.Button.OutlinedButton">
        <item name="strokeColor">@android:color/white</item>
        <item name="android:textColor">@android:color/white</item>
        <item name="rippleColor">@android:color/white</item>
    </style>

Я могу создать отдельный style под темную тему, например

<style name="Login.Button.Outlined.Dark" parent="Widget.MaterialComponents.Button.OutlinedButton">
            <item name="strokeColor">@android:color/black</item>
            <item name="android:textColor">@android:color/black</item>
            <item name="rippleColor">@android:color/black</item>
        </style>

Я могу выбирать соответствующий стиль в

enum class Theme(
    val buttonTheme: ButtonTheme
){
    DARK(
        buttonTheme = ButtonTheme(
            color = android.R.color.holo_blue_bright,
            textColor = android.R.color.white,
            style = R.style.Login_Button_Outlined_Dark
        )

    ),

    LIGHT(
        buttonTheme = ButtonTheme(
            color = android.R.color.holo_orange_dark,
            textColor = android.R.color.black,
            style = R.style.Login_Button_Outlined_Dark
        )
    )
}

Но как установить соответствующий style?, нету никакого метода setStyle, style и т.д?, как наравне с setTextColor.

Либо как использовать, например rippleColor, strokeColor (это из Material Design).

Надеюсь я объяснил доходчиво и примеры понятны

В качестве образца использовал ЭТУ статью источник


Ответы (0 шт):