Necesito cambiar el color del trazo a un color definido por el usuario. Nada que ver con el estado

Necesito cambiar el color del trazo de la aplicación. El usuario es capaz de cambiar el color de fondo así que también necesito que cambien el trazo (contorno) del botón. Como ya está establecido en el dibujable (muestra a continuación) no he encontrado una manera de cambiar esto. Parece que todas las otras preguntas como esta acaba de decir para usar el archivo XML …. pero eso no me deja hacerlo dinámico. ¡Gracias por cualquier ayuda!

Necesito cambiar el color del trazo a un color definido por el usuario. Nada que ver con el estado.

<?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#ffffffff"/> <stroke android:width="3dp" android:color="@color/Dim_Gray" /> <<<<--- This is what I need to change <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> <corners android:bottomRightRadius="12dp" android:bottomLeftRadius="12dp" android:topLeftRadius="12dp" android:topRightRadius="12dp"/> </shape> 

1. Si tiene un archivo dibujable para una "vista" como esta

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <corners android:radius="5dp" /> <solid android:color="@android:color/white" /> <stroke android:width="3px" android:color="@color/blue" /> </shape> 

Entonces usted puede cambiar
a. Color del trazo :

 GradientDrawable drawable = (GradientDrawable)view.getBackground(); drawable.setStroke(3, Color.RED); // set stroke width and stroke color 

segundo. Color sólido :

 GradientDrawable drawable = (GradientDrawable)view.getBackground(); drawable.setColor(Color.RED); // set solid color 

2. Si tiene un archivo dibujable para una "vista" como esta

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:id="@+id/buttonSelected"> <shape> <solid android:color="@color/blue" /> <stroke android:width="1px" android:color="@color/blue" /> </shape> </item> <item android:state_checked="false" android:id="@+id/buttonNotSelected"> <shape android:shape="rectangle"> <solid android:color="@color/white" /> <stroke android:width="1px" android:color="@color/blue" /> </shape> </item> </selector> 

A continuación, puede cambiar los atributos de elementos individuales tomando objetos separables separables por allí posiciones.

 StateListDrawable drawable = (StateListDrawable)view.getBackground(); DrawableContainerState dcs = (DrawableContainerState)drawable.getConstantState(); Drawable[] drawableItems = dcs.getChildren(); GradientDrawable gradientDrawableChecked = (GradientDrawable)drawableItems[0]; // item 1 GradientDrawable gradientDrawableUnChecked = (GradientDrawable)drawableItems[1]; // item 2 

Ahora para cambiar el movimiento o el color sólido:

 //solid color gradientDrawableChecked.setColor(Color.BLUE); gradientDrawableUnChecked.setColor(Color.RED); //stroke gradientDrawableChecked.setStroke(1, Color.RED); gradientDrawableUnChecked.setStroke(1, Color.BLUE); 

Tal vez se están refiriendo a listas de estado de color que le permite cambiar el color basado en si el botón fue presionado / enfocado / habilitado / etc

Intente usar StateLists (en contraposición a ColorStateList). Echa un vistazo: http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList

También puede crear un ShapeDrawable (o un RoundRectShape en su ejemplo) de forma programática y, a continuación, llamar a setBackgroundDrawable del botón

Respondí una pregunta similar en Cambiar color de borde de forma en tiempo de ejecución

Su como la misma solución propuesta por f20k pero en mi caso el drawable era un GradientDrawable en vez de un ShapeDrawable.

Ver si funciona

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.