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.


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);


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.


"é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));

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"));

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.


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.


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"

La question montre clairement que le changement de couleur doit être dynamique.
Peter vdL


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));

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



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.


3

Déclarer avec Android 6 utiliser ContextCompact

        view.setBackgroundColor( ContextCompat.getColor(this, R.color.your_color));


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)

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);

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);

        ....


    }

0

Vous devez passer un intdans l'argument.

Premier exemple:

view.setBackgroundColor(-500136)

Deuxième exemple:

int colorId = R.color.green;

view.setBackgroundResource(colorId);

0

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


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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.