Android: Change Shape Color in runtime

I have a drawable that i use as a Background for a LinearLayout. I would like to change the color of this Shape in runtime. I have tried using several methods.. but none work.

I’ve followed the approach described here: http://www.anddev.org/android-2d-3d-graphics-opengl-problems-f55/change-shape-drawable-solid-color-t16798.html

  • Android: Create new System Permission in through AOSP source code.
  • Convert video Input Stream to RTMP
  • Android start activity when pressing widget ListView item
  • Not able to get the TelephonyManager.CALL_STATE_RINGING
  • Android NDK: Why arm-linux-androideabi-gdb.exe disappeared?
  • Android ScaleAnimation and TranslateAnimation, how to avoid ScaleAnimation movement
  • But have the same problem… it doesnt crashes.. but the color doesnt change!

    <?xml version="1.0" encoding="UTF-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <solid android:color="#00A6C1" />
        <corners android:radius="@dimen/square_corners" />
    </shape>
    

    Snippet of code:

    GradientDrawable drawable = (GradientDrawable) activity.getResources().getDrawable(R.drawable.blue_square_shape);
    
    
    int color = ((Application) getApplication()).getColor();
    drawable.setColor(color);
    
    block.findViewById(R.id.blockSquare).setBackgroundDrawable(drawable);
    
    findViewById(R.id.blockSquare).postInvalidate();
    

    Any clue? I’ve passed the whole day googling… and it’s getting pretty annoying…

    UPDATE:

    When i try to do the same to this Shape:

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/shape" android:shape="rectangle">
        <gradient android:startColor="#1FBCCF" android:endColor="#06A4C1"
            android:angle="270" />
        <corners android:topLeftRadius="@dimen/footer_corners"
            android:topRightRadius="@dimen/footer_corners" />
    </shape>
    

    The color turns to black… what i guess tells it can be changed…

    Related posts:

    Using ActionBar Up Navigation in master/detail fragments
    starting avd fails, saying it can&#039;t find emulator, but it exists
    Events of TextWatcher are being called twice
    Text size and different android screen sizes
    Android: Can somebody please explain what is Activity/Context/Intent in android?
    How to give the user the possibility to switch between different colors skin in your App
  • OnTouchEvent not working on child views
  • Android: Creating file using createNewFile() method
  • Galaxy Nexus Ignores viewport meta tag
  • How does push notification technology work on Android?
  • ViewPager in android is taking full screen?
  • ActionBar Dropdown Spinner item defaults to first item
  • 8 Solutions collect form web for “Android: Change Shape Color in runtime”

    I’m now creating a Drawable like the one pre-compiler.. as i couldn’t change the color to anything but black, even after trying the hex OR described below.

    The new code:

    ShapeDrawable footerBackground = new ShapeDrawable();
    
    // The corners are ordered top-left, top-right, bottom-right,
    // bottom-left. For each corner, the array contains 2 values, [X_radius,
    // Y_radius]
    float[] radii = new float[8];
    radii[0] = activity.getResources().getDimension(R.dimen.footer_corners);
    radii[1] = activity.getResources().getDimension(R.dimen.footer_corners);
    
    radii[2] = activity.getResources().getDimension(R.dimen.footer_corners);
    radii[3] = activity.getResources().getDimension(R.dimen.footer_corners);
    
    footerBackground.setShape(new RoundRectShape(radii, null, null));
    
    int color = ((Application) activity.getApplication()).getColor();
    
    footerBackground.getPaint().setColor(color);
    
    views.setBackgroundDrawable(footerBackground);
    

    Anyway this is a fix.. a solution for the first question is what i’m really looking for! I’ll appreciate any help of course!

    See if something similar to this works for you:

    TextView tv2 = (TextView) rl.findViewById(R.id.toggle_indicator);
    /* Refer to http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.html#mutate()
    to understand why we need to mutate the GradientDrawable*/
    GradientDrawable sd = (GradientDrawable) tv2.getBackground().mutate();
    sd.setColor(0xff999999);
    sd.invalidateSelf();
    

    In my case I have a TextView which has a ShapeDrawable as a background. I wanted to change its color and managed to make this work. Inexplicably, tv2.getBackground() returns a GradientDrawable instead of a ShapeDrawable — this has been reported elsewhere as well.

    Edit: About the color, try setting an alpha value of 0xff. If you notice, even in my code above the setColor() function takes an extra hex value apart from the regular RGB hex value. This is for Alpha/Opacity. If this is set to 0x00 the Drawable will have a black color, irrespective of the RGB (assuming that your background color is black). 0x00 is a completely transparent object & 0xff is a completely opaque object.

    GradientDrawable background = (GradientDrawable) titleTextView.getBackground();
    background.setColor(getResources().getColor(R.color.some_color));
    

    The setColor method correctly requests a redraw on the element
    (If in xml you used the <shape> element it will always become a GradientDrawable)

    There is an easier way:

    ShapeDrawable drawable = new ShapeDrawable();
    drawable.getPaint().setColor(getResources().getColor(R.color.blue));
    getActionBar().setBackgroundDrawable(drawable);
    

    This is what I’m doing in a live wallpaper where I modify a Drawable at runtime:

    this.original = DrawableFactory.getDrawable(getContext().getResources(), objectName)[0];
    originalBitmap = original.getBitmap();
    copy = new BitmapDrawable(getContext().getResources(), original.getBitmap().copy(Bitmap.Config.ARGB_8888, true));
    copyCanvas = new Canvas(copy.getBitmap());
    

    Edit: Type declarations:

    public Bitmap originalBitmap;
    public BitmapDrawable original;
    public BitmapDrawable copy;
    public Canvas copyCanvas;
    

    Edit 2:

    Try this in that case:

    int color = (0xFF000000 | yourParsedColor)
    

    Then set that color.

    (R.drawable.library_cirecle)

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/outerRectangle">
        <shape android:shape="oval" >
            <solid android:color="#FCD366" />
    
            <stroke
                android:width="1dp"
                android:color="@android:color/darker_gray" />
        </shape>
    </item>
    

    change color in code

    Drawable tempDrawable = getResources().getDrawable(R.drawable.library_cirecle);
    LayerDrawable bubble = (LayerDrawable) tempDrawable; (cast to root element in xml)
        GradientDrawable solidColor = (GradientDrawable) bubble.findDrawableByLayerId(R.id.outerRectangle);
        solidColor.setColor(colorToPaint);
        imageView.setImageDrawable(tempDrawable);
    

    My current fix involves having a drawable without the color option. I put it inside a frame layout, and then set the background color of the frame layout object dynamically. It’s still technically a ‘fix,’ but it’s the most simple option in my opinion.

    Layout File:

    <FrameLayout
        android:id="@+id/dateLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/SecondaryGreen">
    
        <ImageView
            android:id="@+id/dateBox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/date_rectangle" />
    
    </FrameLayout>
    

    Date Rectangle Drawable File:

    <shape xmlns:android="http://schemas.android.com/apk/res/android" ><size android:width="50dp" android:height="50dp"/><corners android:radius="5dp"/></shape>
    

    Dynamic Rendering:

    mHolder.dateLayout.setBackgroundColor(getResources().getColor(R.color.SecondaryGreen));
    

    Set GradientDrawable Shape color using hex code/value
    Simply prefix 0x to hexadecimal color value.

        GradientDrawable shape =  new GradientDrawable();
        shape.setCornerRadius( 16 );
        shape.setColor(0xff33b5e5);
        ButtonStartSurvey.setBackground(shape);
    
    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.