Я хотел бы использовать свой атрибут 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
Если я изменю порядок элементов в моем селекторе, эффект не будет