Quiero usar el operador ternario para cambiar el color de una vista personalizada en función de un valor booleano. Aquí está mi vista personalizada
class AddButton(context: Context, attrs: AttributeSet): RelativeLayout(context, attrs) {
private var imageView: AppCompatImageView
private var textView: TextView
init {
inflate(context, R.layout.add_button, this)
imageView = findViewById(R.id.add_button_icon)
textView = findViewById(R.id.add_button_text)
val attributes = context.obtainStyledAttributes(attrs, R.styleable.AddButton)
val iconTint = attributes.getResourceId(R.styleable.AddButton_iconColor, 0)
imageView.setImageDrawable(attributes.getDrawable(R.styleable.AddButton_icon))
textView.text = attributes.getString(R.styleable.AddButton_text)
setIconTint(iconTint)
attributes.recycle()
}
fun setIconTint(colorId: Int) {
imageView.setColorFilter(ContextCompat.getColor(context, colorId), android.graphics.PorterDuff.Mode.SRC_IN);
}
fun setText(text: String) {
textView.text = text
}
}
valores / attr.xml:
<declare-styleable name="AddButton">
<attr name="icon" format="reference"/>
<attr name="iconColor" format="color"/>
<attr name="text" format="string"/>
</declare-styleable>
En el diseño:
<com.my.package.ui.customview.AddButton
app:icon="@drawable/ic_add"
app:iconColor="@{selected ? @color/colorRed : @color/colorBlack}"
app:text="@{selected ? @string/selected : @string/not_selected}"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Se está trabajando como se espera para la aplicación: texto, pero cuando quiero hacerlo por el iconColor tengo este error:
Cannot find a setter for <com.my.package.ui.customview.AddButton app:iconColor> that accepts parameter type 'int'
Por ahora para resolver el problema, tengo que cambiar el color en el código detrás de escucha cuando el cambio booleanos seleccionado y luego llamar al setIconTint de mi vista AddButton.
¿Hay una manera de cambiar el color directamente en el archivo de diseño utilizando el operador ternario?
Que busca un adaptador de unión para la vista personalizada de datos personalizados. En primer lugar, echa un vistazo a esto para el documento completo.
Así que, en resumen, es necesario definir un método llamado: setIconColor
que acepta iconId
y establece el color del icono por el ID de recurso proporcionado.
Pero si usted desea utilizar su método actual nombre setIconTint
, sólo tiene que anotar su clase con:
@BindingMethods(value = [
BindingMethod(
type = AddButton::class,
attribute = "iconColor",
method = "setIconTint")])
Después de todo, una vez más sugiero que consulte otras variantes de adaptadores de unión en el documento oficial.