Android Studio now supports vector assets on 21+ and will generate pngs for lower versions at compile time. I have a vector asset (from the Material Icons) that I want to change the fill color. This works on 21+, but the generated pngs do not change color. Is there a way to do this?
<vector android:height="48dp" android:viewportHeight="24.0"
android:viewportWidth="24.0" android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/primary" android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
As said in other answers, don't edit the vector drawable directly, instead you can tint in java code, like that:
mWrappedDrawable = mDrawable.mutate();
mWrappedDrawable = DrawableCompat.wrap(mWrappedDrawable);
DrawableCompat.setTint(mWrappedDrawable, mColor);
DrawableCompat.setTintMode(mWrappedDrawable, PorterDuff.Mode.SRC_IN);
And for the sake of simplicity, I have created a helper class:
import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.annotation.ColorRes;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
* {@link Drawable} helper class.
* @author Filipe Bezerra
* @version 18/01/2016
* @since 18/01/2016
public class DrawableHelper {
@NonNull Context mContext;
@ColorRes private int mColor;
private Drawable mDrawable;
private Drawable mWrappedDrawable;
public DrawableHelper(@NonNull Context context) {
mContext = context;
public static DrawableHelper withContext(@NonNull Context context) {
return new DrawableHelper(context);
public DrawableHelper withDrawable(@DrawableRes int drawableRes) {
mDrawable = ContextCompat.getDrawable(mContext, drawableRes);
return this;
public DrawableHelper withDrawable(@NonNull Drawable drawable) {
mDrawable = drawable;
return this;
public DrawableHelper withColor(@ColorRes int colorRes) {
mColor = ContextCompat.getColor(mContext, colorRes);
return this;
public DrawableHelper tint() {
if (mDrawable == null) {
throw new NullPointerException("É preciso informar o recurso drawable pelo método withDrawable()");
if (mColor == 0) {
throw new IllegalStateException("É necessário informar a cor a ser definida pelo método withColor()");
mWrappedDrawable = mDrawable.mutate();
mWrappedDrawable = DrawableCompat.wrap(mWrappedDrawable);
DrawableCompat.setTint(mWrappedDrawable, mColor);
DrawableCompat.setTintMode(mWrappedDrawable, PorterDuff.Mode.SRC_IN);
return this;
@SuppressWarnings("deprecation")
public void applyToBackground(@NonNull View view) {
if (mWrappedDrawable == null) {
throw new NullPointerException("É preciso chamar o método tint()");
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setBackground(mWrappedDrawable);
} else {
view.setBackgroundDrawable(mWrappedDrawable);
public void applyTo(@NonNull ImageView imageView) {
if (mWrappedDrawable == null) {
throw new NullPointerException("É preciso chamar o método tint()");
imageView.setImageDrawable(mWrappedDrawable);
public void applyTo(@NonNull MenuItem menuItem) {
if (mWrappedDrawable == null) {
throw new NullPointerException("É preciso chamar o método tint()");
menuItem.setIcon(mWrappedDrawable);
public Drawable get() {
if (mWrappedDrawable == null) {
throw new NullPointerException("É preciso chamar o método tint()");
return mWrappedDrawable;
To use just do the following:
DrawableHelper
.withContext(this)
.withColor(R.color.white)
.withDrawable(R.drawable.ic_search_24dp)
.tint()
.applyTo(mSearchItem);
final Drawable drawable = DrawableHelper
.withContext(this)
.withColor(R.color.white)
.withDrawable(R.drawable.ic_search_24dp)
.tint()
.get();
actionBar.setHomeAsUpIndicator(drawable);
You can do it.
BUT you cannot use @color references for colors (..lame), otherwise it will work only for L+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:fillColor="#FFAABB"
android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zm-6,0C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
Add this library to the Gradle to enable color vector drawable in old android Devices.
compile 'com.android.support:palette-v7:26.0.0-alpha1'
and re sync gradle. I think it will solve the problem.
To change vector image color you can directly use android:tint="@color/colorAccent"
<ImageView
android:id="@+id/ivVectorImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_account_circle_black_24dp"
android:tint="@color/colorAccent" />
To change color programatically
ImageView ivVectorImage = (ImageView) findViewById(R.id.ivVectorImage);
ivVectorImage.setColorFilter(getResources().getColor(R.color.colorPrimary));
If the vectors are not showing individually set colors using fillColor then they may be being set to a default widget parameter.
Try adding app:itemIconTint="@color/lime"
to activity_main.xml to set a default color type for the widget icons.
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:itemIconTint="@color/lime"
app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
VectorDrawable @ developers.android
Go to you MainActivity.java
and below this code
-> NavigationView navigationView = findViewById(R.id.nav_view);
Add single line of code -> navigationView.setItemIconTintList(null);
i.e. the last line of my code
I hope this might solve your problem.
public class MainActivity extends AppCompatActivity {
private AppBarConfiguration mAppBarConfiguration;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setItemIconTintList(null);
Currently the working soloution is
android:fillColor="#FFFFFF"
Nothing worked for me except hard coding in the vector
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:fillColor="#FFFFFF"
android:viewportHeight="24.0">
android:fillColor="#FFFFFF"
android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zm-6,0C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
However, fillcolor and tint might work soon. Please see this discussion for more information:
https://code.google.com/p/android/issues/detail?id=186431
Also the colors mighr stick in the cache so deleting app for all users might help.
Update: AppCompat
support
Other answers suspecting if android:tint
will work on only 21+ devices only, AppCompat(v23.2.0 and above) now provides a backward compatible handling of tint attribute.
So, the course of action would be to use AppCompatImageView
and app:srcCompat
(in AppCompat namespace) instead of android:src
(Android namespace).
Here is an example(AndroidX: This is androidx.appcompat.widget.AppCompatImageView ;)):
<android.support.v7.widget.AppCompatImageView
android:id="@+id/credits_material_icon"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginBottom="8dp"
android:layout_marginLeft="16dp"
android:layout_marginStart="16dp"
android:scaleType="fitCenter"
android:tint="#ffd2ee"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:srcCompat="@drawable/ic_dollar_coin_stack" />
And don't forget to enable vector drawable support in gradle:
vectorDrawables.useSupportLibrary = true
Android studio now supports vectors pre-lollipop. No PNG conversion. You can still change your fill color and it will work.
In you ImageView, use
app:srcCompat="@drawable/ic_more_vert_24dp"
In your gradle file,
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
compile 'com.android.support:design:23.4.0'
For those not using an ImageView
, the following worked for me on a plain View
(and hence the behaviour should replicate on any kind of view)
android:background="@drawable/ic_reset"
android:backgroundTint="@color/colorLightText" />
if you look to support old version pre lolipop
use the same xml code with some changes
instead of normal ImageView --> AppCompatImageView
instead of android:src --> app:srcCompat
here is example
<android.support.v7.widget.AppCompatImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:id="@+id/button"
app:srcCompat="@drawable/ic_more_vert_24dp"
android:tint="@color/primary" />
dont forget update your gradle as @ Sayooj Valsan mention
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
compile 'com.android.support:design:23.4.0'
Notice To any one use vector dont ever ever never give your vector reference to color like this one android:fillColor="@color/primary"
give its hex value .
Examples related to android
• Under what circumstances can I call findViewById with an Options Menu / Action Bar item?
• How to implement a simple scenario the OO way
• My eclipse won't open, i download the bundle pack it keeps saying error log
• getting " (1) no such column: _id10 " error
• java doesn't run if structure inside of onclick listener
• Cannot retrieve string(s) from preferences (settings)
• strange error in my Animation Drawable
• how to put image in a bundle and pass it to another activity
• FragmentActivity to Fragment
• A failure occurred while executing com.android.build.gradle.internal.tasks
Examples related to android-studio
• A failure occurred while executing com.android.build.gradle.internal.tasks
• "Failed to install the following Android SDK packages as some licences have not been accepted" error
• Android Gradle 5.0 Update:Cause: org.jetbrains.plugins.gradle.tooling.util
• This version of Android Studio cannot open this project, please retry with Android Studio 3.4 or newer
• WARNING: API 'variant.getJavaCompile()' is obsolete and has been replaced with 'variant.getJavaCompileProvider()'
• Flutter plugin not installed error;. When running flutter doctor
• ADB.exe is obsolete and has serious performance problems
• Android design support library for API 28 (P) not working
• Flutter command not found
• How to find the path of Flutter SDK
Examples related to vector-graphics
• Change fill color on vector asset in Android Studio
• SVG rounded corner
• Do I use <img>, <object>, or <embed> for SVG files?
Examples related to android-vectordrawable
• Change fill color on vector asset in Android Studio