Comment définir la couleur d'arrière-plan d'une vue

180

J'essaie de définir la couleur d'arrière-plan d'une vue (dans ce cas, un bouton).

J'utilise ce code:

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

Cela fait disparaître le bouton de l'écran. Qu'est-ce que je fais mal et quelle est la bonne façon de changer la couleur d'arrière-plan sur n'importe quelle vue?

Merci.

Peter vdL
la source
1
Cela semble correct. En fait, je ne pense pas que vous ayez besoin d'appeler invalidate (). Lorsque vous dites que le bouton disparaît, voulez-vous dire que littéralement ou voulez-vous dire que le bouton contient du texte ou une image qui disparaît?
RickNotFred

Réponses:

284

Vous avez rendu votre bouton transparent. Le premier octet est l'alpha.

Essayer v.setBackgroundColor(0xFF00FF00);

rainhut
la source
2
La réponse d'EddieB ci-dessous est bien meilleure car cela supprime toutes les bordures, etc., telles que le soulignement d'un EditText
Molten Ice
@aroth est meilleur Color.Green? Si je veux des couleurs complexes avec argb? ... votre réponse est obsolète
2
@delive - Revenez? Color.GREEN n'est pas obsolète et inclut l'octet alpha. Il Apprécions est 0xff00ff00, exactement la même chose que ce qui est suggéré dans la réponse, sauf qu'il a aussi l'avantage d'être lisible par l' homme . La plupart des développeurs préfèrent une solution lisible par l'homme.
aroth
146

Lorsque vous appelez setBackgoundColor, il écrase / supprime toute ressource d'arrière-plan existante, y compris les bordures, les coins, le remplissage, etc. Ce que vous voulez faire est de changer la couleur de la ressource d'arrière-plan existante ...

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

Expérimentez avec PorterDuff.Mode. * Pour différents effets.

EddieB
la source
"écrase / supprime toute ressource d'arrière-plan existante", pas vraiment.
Yousha Aleayoub
2
J'ai dû utiliser ce qui précède avec v.invalidate (); sur la ligne suivante.
Hashim Akhtar
1
essayé ce temps perdu et est allé avec la réponse acceptée, v.getBackground () a donné une exception nullpointer et s'est écrasé.
Siddarth G le
Ce plus PorterDuff.Mode.SRC_IN a résolu pour moi afin que je ne perde pas ma bordure d'arrière-plan.
Guilherme Carvalho
130

Plusieurs choix pour ce faire ...

Définir l'arrière-plan sur vert:

v.setBackgroundColor(0x00FF00);

Définir l'arrière-plan en vert avec Alpha :

v.setBackgroundColor(0xFF00FF00);

Définissez l'arrière-plan sur vert avec la constante Color.GREEN:

v.setBackgroundColor(Color.GREEN);

Définir l'arrière-plan en vert définissant dans Colors.xml

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

et en utilisant:

v.setBackgroundResource(R.color.myGreen);

et:

v.setBackgroundResource(R.color.myGreenWithAlpha);

ou le plus long:

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

et:

v.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.myGreenWithAlpha));
Jorgesys
la source
getResources().getColor(...)est obsolète stackoverflow.com/questions/31842983/…
Junior Mayhé
5
Il y a aussi: v.setBackgroundResource(R.color.myGreen);lors de l'utilisationcolors.xml
sinistre
Suppression des invalidateappels, car vous pouvez voir que les setBackground... méthodes appellent déjà cela.
weston le
v.setBackgroundColor(0x00FF00);est juste leur code qui, selon eux, ne fonctionne pas. Je m'attendrais également à ce que ce soit transparent.
weston le
37

Vous pouvez définir la couleur hexadécimale de n'importe quelle ressource avec:

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

Le code ne met pas le bouton au vert. Au lieu de cela, cela rend le bouton totalement invisible.

Explication: la valeur hexadécimale de la couleur est incorrecte. Avec une valeur Alpha de zéro, la couleur sera invisible.

La valeur hexadécimale correcte correspond 0xFF00FF00au vert d'opacité totale. Toute valeur alpha comprise entre 00 et FF entraînerait de la transparence.

malte kosian
la source
12

et quelle est la manière correcte de changer la couleur d'arrière-plan sur n'importe quelle vue?

Sur tout View ? Ce que vous avez est correct, mais vous devez abandonner l' invalidate()appel.

Cependant, certains Viewsont déjà des antécédents. A Button, par exemple, a déjà un arrière-plan: la face du bouton lui-même. Cet arrière-plan est un StateListDrawable, que vous pouvez trouver android-2.1/data/res/drawable/btn_default.xmldans votre installation du SDK Android. Cela, à son tour, fait référence à un groupe d'images bitmap à neuf patchs, disponibles en plusieurs densités. Vous auriez besoin de cloner et de modifier tout cela pour atteindre vos objectifs écologiques.

En bref, vous serez mieux servi pour trouver un autre modèle d'interface utilisateur plutôt que d'essayer de changer l'arrière-plan d'un fichier Button.

CommonsWare
la source
OK, merci pour l'explication sur les arrière-plans Button. Neuf patchs bitmaps ( developer.android.com/reference/android/graphics/NinePatch.html ) étaient nouveaux pour moi. Je veux simplement changer la couleur de tout ce qui s'affiche à l'écran lorsque j'appuie sur un bouton. Les boutons sont sur un TextView. Essayer de changer la couleur de cela, conduit à des messages de console "Délai d'attente du reg de distribution DDM ... ActivityManager: Impossible de distribuer le bloc DDM 52454151: aucun gestionnaire défini" et une boîte de dialogue à l'écran "l'application s'est arrêtée de manière inattendue". Je suppose que j'ai besoin de lire davantage sur l'interface utilisateur. Tous les indices sont les bienvenus. Merci.
Peter vdL
12

Pour définir la première couleur à voir à l'écran, vous pouvez également le faire dans le layout.xml approprié (meilleur design) en ajoutant cette propriété à la vue appropriée:

android:background="#FF00FF00"
Justin B
la source
La question montre clairement que le changement de couleur doit être dynamique.
Peter vdL
12

essayez d'ajouter:

setBackgroundColor(Color.parseColor("#FF0000"));
Arc-en-ciel long
la source
6

J'utilise à l'API min 16, cible 23

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

WeekDoneButton.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorAccent));
Vostro
la source
Il n'y a généralement pas beaucoup de couleurs par défaut. De nouvelles couleurs peuvent être définies dans res / values ​​/ colors comme décrit ici developer.android.com/samples/BasicMediaRouter/res/values/…
Krystian
6
mButton.setBackgroundColor(getResources().getColor(R.color.myColor));
Gianluca Demarinis
la source
5

Vous pouvez utiliser simplement:

view.setBackgroundColor(Color.parseColor("#FFFFFF"));
Daniel Kilinskas
la source
4

Cette question parle de changer la couleur d'arrière-plan d'une vue. Dans l'une des réponses, la personne explique comment changer la couleur d'arrière-plan pendant l'exécution. Évidemment, vous allez examiner comment modifier d'autres objets à l'écran, mais cela devrait vous donner un bon départ en vous permettant au moins de modifier la couleur d'arrière-plan de la vue en cliquant sur le bouton.

jbranchaud
la source
3

Déclarer avec Android 6 utiliser ContextCompact

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

Vous pouvez utiliser simplement:

view.setBackgroundColor(Color.rgb(0, 198, 255));
Sabre Eldien Mahmoud Salah
la source
2

Dans kotlin, vous pouvez le faire comme ceci:

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

getColorCompat()est une fonction d'extension:

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

 fun Context.getColorCompat(color: Int) = ContextCompat.getColor(this, color)
Développeur Android
la source
1
view.setBackgroundColor(R.color.primaryColor);

Ajoute de la couleur à la valeur de couleur précédente, donc j'ai une couleur différente.

Ce qui fonctionne pour moi, c'est:

view.setBackgroundResource(R.color.primaryColor);
meralon
la source
1

Supposons que nous avons une couleur primaire en values=>colors.xmltant que:

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

donc si nous voulons utiliser notre couleur personnalisée, setBackgroundColor(@ColorInt int Color)nous avons juste besoin d'une annotation @SuppressLint("ResourceAsColor")avec constructeur / méthode qui sera utilisée comme:

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

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

        ....


    }
ForWebTech
la source
0

Vous devez passer un intdans l'argument.

Premier exemple:

view.setBackgroundColor(-500136)

Deuxième exemple:

int colorId = R.color.green;

view.setBackgroundResource(colorId);
David Mutenda
la source
0

Cela devrait fonctionner correctement: v.setBackgroundColor(0xFF00FF00);

nishanuw
la source
0

J'ai essayé toutes les méthodes ci-dessus. Mais je n'ai pas atteint ce dont j'ai besoin. Voici mon essai. Si vous utilisez un code hexadécimal pour la couleur et que vous souhaitez définir la couleur comme arrière-plan de l'image, il s'agit du code 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
la source