Используйте пользовательские атрибуты в селекторе - PullRequest
0 голосов
/ 09 апреля 2019

Я хотел бы использовать свой атрибут error для изменения цвета фона пользовательского элемента управления

Я создал атрибуты в attrs.xml

<resources>
    <declare-styleable name="InfoControl">
        <attr name="title" format="string"/>
        <attr name="value" format="string"/>
        <attr name="error" format="boolean"/>
    </declare-styleable>
</resources>

Мой пользовательский класс, который наследует отConstraintLayout

class InfoControl @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyle: Int = 0
) : ConstraintLayout(context, attrs, defStyle) {

    private var error = false

    init {
        LayoutInflater.from(context)
            .inflate(R.layout.info_control, this, true)

        val att = context.obtainStyledAttributes(attrs, R.styleable.InfoControl)
        tv_title.text = att.getString(R.styleable.InfoControl_title)
        tv_value.text = att.getString(R.styleable.InfoControl_value)
        error = att.getBoolean(R.styleable.InfoControl_error, false)
        att.recycle()
    }

    override fun onCreateDrawableState(extraSpace: Int): IntArray {
        return if (error) {
            val errorState = super.onCreateDrawableState(extraSpace + 1)
            View.mergeDrawableStates(errorState, intArrayOf(R.attr.error))
        }
        else {
            super.onCreateDrawableState(extraSpace)
        }
    }

    fun setStateError(isError: Boolean) {
        if (error != isError) {
            error = isError
            refreshDrawableState()
        }
    }
}

И мой селектор в xml file

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        app:error="true"
        android:drawable="@drawable/background_control_error"/>
    <item app:error="false"
          android:drawable="@drawable/background_control"/>
</selector>

Макет моего пользовательского элемента управления (я удалил неважные строки)

<android.support.constraint.ConstraintLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@drawable/background_control_selector">

И чтобыиспользовал этот макет

    <com.example.package.InfoControl
        app:error="false"
        app:title="The title"
        app:value="1234"
        android:id="@+id/ic_id"
        style="@style/style_info_control"/>

Результат

Теперь у меня есть хороший стиль, но фон не меняется, если я изменяю атрибут ошибки

Test

Если я изменю порядок элементов в моем селекторе, эффект не будет

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