Set text color using data binding on Android
I seems the int
you are providing is interpreted as a hex color, even though it seem intuitive that this setter should be expecting a resource ID.
use the Context
reference generated for each bindable view, and use it to convert the resource ID to the color you are pointing to, as described in the DataBinding Dev Guide:
A special variable named context is generated for use in binding expressions as needed. The value for context is the Context from the root View's getContext().
use it to set color like this:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{data.text}"
android:textColor="@{context.getColor(data.colorRes)}"
/>
Edit
for backwards compatibility you can use ContextCompat. Import needed:
<layout>
<data>
<import type="android.support.v4.content.ContextCompat"/>
<variable name="data" type="com.whatever.myapp.MyModel"/>
...
</data>
...
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{data.text}"
android:textColor="@{ContextCompat.getColor(context, data.colorRes)}"
/>
</layout>
In addition to the solution of @Mardann, here is an updated solution that also works on API lower than 23 by using ContextCompat.getColor():
<layout>
<data>
<import type="androidx.core.content.ContextCompat" />
<variable
name="data"
type="com.example.myapp.MyDataObject" />
</data>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{data.text}"
android:textColor="@{ContextCompat.getColor(context, data.colorRes)}"/>
</layout>
- Make sure to import ContextCompat as shown above.
- You can automagically 'context' as method parameter for ContextCompat.getColor() because it will be automatically resolved to the view's context.
create method by using BindingAdapter
@BindingAdapter({"bind:color"})
public static void setColor(TextView textView, Item item) {
textView.setTextColor(<set color of your choice>);
}
and to call it from xml
app:color="@{item}"
In my case, the color value was in a String Format(eg. "#000000")
1.String TxtColor = "#000000"
2.Import "android.graphics.Color"
<layout>
<data>
<import type="android.graphics.Color"/>
<variable name="txtColor" type="String"/>
</data>
.... other views
</layout>
3.Set to Desired View -- In my case it was TextView
........ other views
<android.support.v7.widget.AppCompatTextView
android:id="@+id/tvTitle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textcolor= "@{Color.parseColor(txtColor)}" //when we import android.graphics.Color we can access it's all methods present
tools:text="Test"/>
...... other views
4.Binding from Activity/Adapter --in my case it was Adapter
inner class ViewHolder(private val binding: BindingClass) :
RecyclerView.ViewHolder(binding.root) {
fun setData(data: DataClass, TxtColor : String?) {
binding.txtColor= TxtColor
binding.executePendingBindings()
}
}