android - ropa - Necesito cambiar el color de trazo a un color definido por el usuario. Nada que ver con el estado
relleno de color en el cabello (5)
Necesito cambiar el color de trazo de la aplicación. El usuario puede cambiar el color de fondo, así que también debo permitirle cambiar 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 solo dicen que use el archivo XML ... pero eso no me permite hacerlo dinámico. ¡Gracias por cualquier ayuda!
Necesito cambiar el color de 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>
Intente usar StateLists (en lugar de ColorStateList). Eche un vistazo: http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList
También puede crear un ShapeDrawable
(o ShapeDrawable
en su ejemplo) programáticamente y luego llamar al setBackgroundDrawable
del botón
Mire el LayerDrawable porque se creó a partir de su XML y se usó en tiempo de ejecución.
Aquí hay un ejemplo de demostración:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle" >
<solid android:color="@android:color/transparent" />
</shape>
</item>
<item android:id="@+id/itemId" android:top="-4dp" android:right="-4dp" android:left="-4dp">
<shape>
<solid android:color="@android:color/transparent"/>
<stroke
android:width="1.5dp"
android:color="#06C1D7" >
</stroke>
<padding
android:bottom="-2dp"/>
</shape>
</item>
</layer-list>
Puedes modificarlo en tiempo de ejecución como:
LayerDrawable layerDrawable = (LayerDrawable) getResources()
.getDrawable(R.drawable.only_one_bottom_line);
GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.itemId);
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1.5f, getResources().getDisplayMetrics());
gradientDrawable.setStroke(px, getResources().getColor(R.color.theme_color));
tv_select_city_name.setBackground(layerDrawable);
Quizás se estén refiriendo a las listas de estado de color, que le permiten cambiar el color en función de si el botón fue presionado / enfocado / habilitado / etc.
Respondí una pregunta similar en Cambio de color de borde de forma en tiempo de ejecución
Es como la misma solución propuesta por f20k, pero en mi caso el dibujable era un GradientDrawable en lugar de un ShapeDrawable.
ver si funciona ...
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 puedes 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>
Luego puede cambiar los atributos individuales del elemento tomando diferentes objetos dibujables por sus 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 trazo 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);