Waseem
Waseem

Reputation: 577

How to set layout background tint from string programmatically?

I tried this code:

LinearLayout someLayout=(LinearLayout)view.findViewById(R.id.someLayout);
        someLayout.setBackgroundTintList(context.getResources().getColorStateList(Color.parseColor("#ff8800")));

But I'm getting an error: android.content.res.Resources$NotFoundException I'm getting the color hex from external source so I can't embed it in colors.xml. Also I want to change the tint, not the background so setBackground is not an option.

Upvotes: 11

Views: 19718

Answers (5)

Dasser Basyouni
Dasser Basyouni

Reputation: 3252

In case you are using BindingAdapter, Kotlin and targeting more recent Android versions:

@JvmStatic
@BindingAdapter("app:backgroundTint")
fun LinearLayout.setBackgroundTint(@ColorInt color: Int) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        background.colorFilter = BlendModeColorFilter(color, BlendMode.SRC_ATOP)
    } else {
        background.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
    }
}

Upvotes: 0

andre carrenho lopes
andre carrenho lopes

Reputation: 21

For Kotlin , I modified @Krestek answer :

someLayout.background.setColorFilter(Color.parseColor("#ff8800"), PorterDuff.Mode.SRC_ATOP)

Upvotes: 2

Jin Lim
Jin Lim

Reputation: 2150

I was able to manage using the following line. change it to your circumstances.

myView.getBackground().setTint(currentView.getResources().getColor(R.color.colorAccent));

Upvotes: 11

Waseem
Waseem

Reputation: 577

I figured I can't use getColorStateList() so I searched for another way to do it. At the end I was able to set color tint using the following code:

LinearLayout someLayout=(LinearLayout)view.findViewById(R.id.someLayout);
        someLayout.getBackground().setColorFilter(Color.parseColor("#ff8800"), PorterDuff.Mode.SRC_ATOP);

This worked as if I changed the backgroundTint property in the xml file, so it's perfect for my problem.

Upvotes: 23

C. Alen
C. Alen

Reputation: 214

You can't do this like that because getColorStateList method expect int id of resource, and you are passing RGB color int. You should create color state list following this link

and then set it like this:

.getColorStateList(R.color.your_xml_name)

Upvotes: -1

Related Questions