¿Cómo cambiar el color de la forma de forma dinámica?

yo tengo

      

Así que ahora quiero que esta forma cambie de colores en función de la información que obtengo de una llamada al servicio web. Por lo tanto, podría ser de color amarillo, verde o rojo o lo que sea, dependiendo del color que reciba de la llamada de servicio web.

¿Cómo puedo cambiar el color de la forma? Basado en esta información?

Podrías modificarlo simplemente así

 GradientDrawable bgShape = (GradientDrawable)btn.getBackground(); bgShape.setColor(Color.BLACK); 

En mi caso, se bloqueó porque getBackground devolvió un GradientDrawable lugar de un ShapeDrawable .

Así que lo modifiqué así:

 ((GradientDrawable)someView.getBackground()).setColor(someColor); 

Esto funciona para mí, con un recurso xml inicial:

 example.setBackgroundResource(R.drawable.myshape); GradientDrawable gd = (GradientDrawable) example.getBackground().getCurrent(); gd.setColor(Color.parseColor("#000000")); gd.setCornerRadii(new float[]{30, 30, 30, 30, 0, 0, 30, 30}); gd.setStroke(2, Color.parseColor("#00FFFF"), 5, 6); 

Resultado de lo anterior: http://sofes.miximages.com/android/hKUR7.png

Puedes construir tus propias formas en Java. Hice esto para un iPhone como Page Controler y pinto las formas en Java:

 /** * Builds the active and inactive shapes / drawables for the page control */ private void makeShapes() { activeDrawable = new ShapeDrawable(); inactiveDrawable = new ShapeDrawable(); activeDrawable.setBounds(0, 0, (int) mIndicatorSize, (int) mIndicatorSize); inactiveDrawable.setBounds(0, 0, (int) mIndicatorSize, (int) mIndicatorSize); int i[] = new int[2]; i[0] = android.R.attr.textColorSecondary; i[1] = android.R.attr.textColorSecondaryInverse; TypedArray a = this.getTheme().obtainStyledAttributes(i); Shape s1 = new OvalShape(); s1.resize(mIndicatorSize, mIndicatorSize); Shape s2 = new OvalShape(); s2.resize(mIndicatorSize, mIndicatorSize); ((ShapeDrawable) activeDrawable).getPaint().setColor( a.getColor(0, Color.DKGRAY)); ((ShapeDrawable) inactiveDrawable).getPaint().setColor( a.getColor(1, Color.LTGRAY)); ((ShapeDrawable) activeDrawable).setShape(s1); ((ShapeDrawable) inactiveDrawable).setShape(s2); } 

espero que esto ayude. Greez Fabian

  LayerDrawable bgDrawable = (LayerDrawable) button.getBackground(); final GradientDrawable shape = (GradientDrawable) bgDrawable.findDrawableByLayerId(R.id.round_button_shape); shape.setColor(Color.BLACK); 

circle.xml (dibujable)

      

diseño

  

en actividad

  circleColor = (ImageView) view.findViewById(R.id.circleColor); int color = Color.parseColor("#00FFFF"); ((GradientDrawable)circleColor.getBackground()).setColor(color); 

Tal vez alguien más necesite cambiar el color en el XML sin crear múltiples derivables como yo necesitaba. Luego haz un círculo que se pueda dibujar sin color y luego especifica backgroundTint para ImageView.

circle.xml

    

Y en tu diseño :

  

Editar:

Hay un error con respecto a este método que impide que funcione en Android Lollipop 5.0 (API nivel 21). Pero se han corregido en versiones más nuevas.

Esta solución funcionó para mí usando el android sdk v19:

 //get the image button by id ImageButton myImg = (ImageButton) findViewById(R.id.some_id); //get drawable from image button GradientDrawable drawable = (GradientDrawable) myImg.getDrawable(); //set color as integer //can use Color.parseColor(color) if color is a string drawable.setColor(color) 

Si tienes una imageView como esta:

   

que le dan una forma dibujable como src, puede usar este código para cambiar el color de la forma:

 ImageView iv = (ImageView)findViewById(R.id.color_button); GradientDrawable bgShape = (GradientDrawable)iv.getDrawable(); bgShape.setColor(Color.BLACK); 

Mi forma xml:

      

Mi actividad xml:

        

Mi actividad java:

  TextView testText = (TextView) findViewById(R.id.test_text); ((GradientDrawable)testText.getBackground()).setStroke(10,Color.BLACK); 

Cuadro de resultados : resultado

Intento la respuesta de Ronnie y mi aplicación se cuelga. Luego reviso mi xml dibujable. Se parece a esto:

 ... 

. Lo cambié a esto: (también cambié los atributos)

  ...  

Funciona.

Para aquellos que enfrentan el mismo problema.