Android operador ternario en el atributo de color personalizado para la vista personalizada

BenCLT:

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?

Mohammad Omidvar:

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: setIconColorque acepta iconIdy 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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=341449&siteId=1
Recomendado
Clasificación