Cómo establecer el color de fondo de una vista

179

Estoy tratando de establecer el color de fondo de una Vista (en este caso, un Botón).

Yo uso este código:

// set the background to green
v.setBackgroundColor(0x0000FF00 );
v.invalidate();

Hace que el botón desaparezca de la pantalla. ¿Qué estoy haciendo mal y cuál es la forma correcta de cambiar el color de fondo en cualquier vista?

Gracias.

Peter vdL
fuente
1
Eso se ve correcto. De hecho, no creo que necesite llamar a invalidate (). Cuando dice que el botón desaparece, ¿quiere decir que literalmente o quiere decir que el botón tenía texto o una imagen que desaparece?
RickNotFred

Respuestas:

281

Hiciste tu botón transparente. El primer byte es el alfa.

Tratar v.setBackgroundColor(0xFF00FF00);

Rainhut
fuente
2
La respuesta de EddieB a continuación es mucho mejor ya que esto elimina cualquier borde, etc., como el subrayado de EditText
Molten Ice
@aroth es mejor Color.Green? Si quiero color complext con argb? ... su respuesta está en desuso
entrega el
2
@delive - ¿Ven de nuevo? Color.GREEN no está en desuso e incluye el byte alfa. Su valor es 0xff00ff00, exactamente el mismo que lo sugerido en la respuesta, excepto que también tiene el beneficio de ser legible para los humanos . La mayoría de los desarrolladores preferirían una solución legible para humanos.
Aroth
145

Cuando llama a setBackgoundColor, sobrescribe / elimina cualquier recurso de fondo existente, incluidos los bordes, esquinas, relleno, etc. Lo que desea hacer es cambiar el color del recurso de fondo existente ...

View v;
v.getBackground().setColorFilter(Color.parseColor("#00ff00"), PorterDuff.Mode.DARKEN);

Experimente con PorterDuff.Mode. * Para obtener diferentes efectos.

EddieB
fuente
"sobrescribe / elimina cualquier recurso de fondo existente", en realidad no.
Yousha Aleayoub
2
Tuve que usar lo anterior junto con v.invalidate (); en la proxima linea.
Hashim Akhtar
1
probé este tiempo perdido y seguí con la respuesta aceptada, v.getBackground () dio una excepción de puntero nulo y se bloqueó.
Siddarth G
Esto más PorterDuff.Mode.SRC_IN me resolvió para que no perdiera mi borde de fondo.
Guilherme Carvalho
123

Varias opciones para hacer esto ...

Establecer fondo en verde:

v.setBackgroundColor(0x00FF00);

Establezca el fondo en verde con Alpha :

v.setBackgroundColor(0xFF00FF00);

Establezca el fondo en verde con Color.GREEN constante:

v.setBackgroundColor(Color.GREEN);

Establezca el fondo en verde definiendo en Colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>     
    <color name="myGreen">#00FF00</color> 
    <color name="myGreenWithAlpha">#FF00FF00</color> 
</resources>

y usando:

v.setBackgroundResource(R.color.myGreen);

y:

v.setBackgroundResource(R.color.myGreenWithAlpha);

o el más largo sin aliento:

v.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.myGreen));

y:

v.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.myGreenWithAlpha));
Jorgesys
fuente
getResources().getColor(...)consiguió obsoleto stackoverflow.com/questions/31842983/…
Junior Mayhé
55
También hay: v.setBackgroundResource(R.color.myGreen);cuando se usacolors.xml
sombrío
Eliminó las invalidatellamadas, como puede ver, los setBackground... métodos ya lo llaman.
weston
v.setBackgroundColor(0x00FF00);es solo su código que dicen que no funciona. También esperaría que fuera transparente.
Weston
35

Puede establecer el color hexadecimal en cualquier recurso con:

View.setBackgroundColor(Color.parseColor("#e7eecc"));
Vipul Patel
fuente
16
// set the background to green
v.setBackgroundColor(0x0000FF00 );
v.invalidate();

El código no establece el botón en verde. En cambio, hace que el botón sea totalmente invisible.

Explicación: el valor hexadecimal del color es incorrecto. Con un valor Alfa de cero, el color será invisible.

El valor hexadecimal correcto es 0xFF00FF00para el verde de opacidad total. Cualquier valor alfa entre 00 y FF causaría transparencia.

malte kosian
fuente
12

¿Cuál es la forma correcta de cambiar el color de fondo en cualquier vista?

En cualquier View ? Lo que tienes es correcto, aunque debes soltar elinvalidate() llamada.

Sin embargo, algunos Viewsya tienen antecedentes. A Button, por ejemplo, ya tiene un fondo: la cara del botón en sí. Este fondo es un StateListDrawable, que puedes encontrar enandroid-2.1/data/res/drawable/btn_default.xml en su instalación de Android SDK. Eso, a su vez, se refiere a un montón de imágenes de mapa de bits de nueve parches, disponibles en múltiples densidades. Tendría que clonar y modificar todo eso para lograr sus objetivos ecológicos.

En resumen, será mejor que encuentre otro patrón de IU en lugar de intentar cambiar el fondo de a Button.

CommonsWare
fuente
OK, gracias por la explicación sobre los fondos de los botones. Nueve mapas de bits de parches ( developer.android.com/reference/android/graphics/NinePatch.html ) eran nuevos para mí. Simplemente quiero cambiar el color de cualquier cosa en la pantalla cuando presiono un botón. Los botones están en un TextView. Intentar cambiar el color de eso, lleva a los mensajes de la consola "DDM dispatch reg wait timeout ... ActivityManager: No se puede enviar el fragmento DDM 52454151: no hay un controlador definido" y un diálogo en la pantalla "la aplicación se detuvo inesperadamente". Supongo que necesito leer más sobre la interfaz de usuario. Cualquier pista de bienvenida. Gracias.
Peter vdL
12

Para configurar el primer color que se verá en la pantalla, también puede hacerlo en el layout.xml relevante (mejor diseño) agregando esta propiedad a la Vista relevante:

android:background="#FF00FF00"
Justin B
fuente
La pregunta deja en claro que el cambio de color debe ser dinámico.
Peter vdL
11

intenta agregar:

setBackgroundColor(Color.parseColor("#FF0000"));
Arco iris largo
fuente
6

Yo uso en API min 16, objetivo 23

Button WeekDoneButton = (Button) viewWeeklyTimetable.findViewById(R.id.week_done_button);

WeekDoneButton.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorAccent));
Vostro
fuente
Por lo general, no hay muchos colores predeterminados. Se pueden definir nuevos colores en res / values ​​/ colors como se describe aquí developer.android.com/samples/BasicMediaRouter/res/values/…
Krystian
5

Puede usar de manera simple:

view.setBackgroundColor(Color.parseColor("#FFFFFF"));
daniel kilinskas
fuente
5
mButton.setBackgroundColor(getResources().getColor(R.color.myColor));
Gianluca Demarinis
fuente
4

Esta pregunta habla sobre cambiar el color de fondo de una vista. En una de las respuestas, la persona explica cómo cambiar el color de fondo durante el tiempo de ejecución. Obviamente, verá cómo modificar otros objetos en la pantalla, pero esto debería darle un buen comienzo al permitirle al menos modificar el color de fondo de la vista al hacer clic en el botón.

jbranchaud
fuente
3

Estableciendo con Android 6 use ContextCompact

        view.setBackgroundColor( ContextCompat.getColor(this, R.color.your_color));
Raluca Lucaci
fuente
2

Puede usar de manera simple:

view.setBackgroundColor(Color.rgb(0, 198, 255));
Mahmoud salah eldien saber
fuente
2

En kotlin podrías hacerlo así:

val backgroundColor = R.color.whatever_color_you_like
view.setBackgroundColor(getColorCompat(backgroundColor))

Donde getColorCompat()es una función de extensión:

/**
 * Extension method to provide simpler access to {@link ContextCompat#getColor(int)}.
 */

 fun Context.getColorCompat(color: Int) = ContextCompat.getColor(this, color)
Desarrollador de Android
fuente
1
view.setBackgroundColor(R.color.primaryColor);

Agrega color al valor de color anterior, por lo que tengo un color diferente.

Lo que funciona para mí es:

view.setBackgroundResource(R.color.primaryColor);
meralon
fuente
1

Vamos a suponer que tenemos un color primario en el values=>colors.xmlque:

<resources>
    <color name="primary">#FDD835</color>
</resources>

así que si queremos usar nuestro color personalizado, setBackgroundColor(@ColorInt int Color)entonces solo necesitamos una anotación @SuppressLint("ResourceAsColor")con constructor / método que se usará como:

    @SuppressLint("ResourceAsColor")
    public _LinearLayout(Context context) {
        super(context);

        // Formatting our layout : )
        super.setBackgroundColor(R.color.primary);

        ....


    }
ForWebTech
fuente
0

Debe pasar un inten el argumento.

Primer ejemplo:

view.setBackgroundColor(-500136)

Segundo ejemplo

int colorId = R.color.green;

view.setBackgroundResource(colorId);
David Mutenda
fuente
0

Esto debería funcionar bien: v.setBackgroundColor(0xFF00FF00);

nishanuw
fuente
0

Intenté todas las formas anteriores. Pero no he logrado lo que necesito. Aquí está mi intento. Si está utilizando el código hexadecimal para el color y desea establecer el color como fondo de la imagen, entonces este es el código kotlin.

val bitmap = Bitmap.createBitmap(30, 30, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
val colorCode = "#ffffff"
canvas.drawColor(Color.parseColor(colorCode))
mImageViewLogo.setImageBitmap(bitmap)
Shaffz
fuente