Come impostare il colore di sfondo di una vista


179

Sto cercando di impostare il colore di sfondo di una vista (in questo caso un pulsante).

Io uso questo codice:

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

Fa scomparire il pulsante dallo schermo. Cosa sto facendo di sbagliato e qual è il modo corretto di cambiare il colore di sfondo in qualsiasi Vista?

Grazie.


1
Sembra corretto. In effetti, non penso che sia necessario chiamare invalidate (). Quando dici che il pulsante scompare, intendi letteralmente o intendi che sul pulsante c'era del testo o un'immagine che scompare?
RickNotFred

Risposte:


281

Hai reso il tuo pulsante trasparente. Il primo byte è l'alfa.

Provare v.setBackgroundColor(0xFF00FF00);


2
La risposta di EddieB di seguito è molto migliore in quanto rimuove eventuali bordi ecc. Come la sottolineatura di un EditText
Molten Ice,

@aroth è meglio Color.Green? Se voglio il complext di colore con argb? ... la tua risposta è obsoleta
consegna il

2
@delive - Vieni di nuovo? Color.GREEN non è obsoleto e include il byte alfa. Il suo valore è 0xff00ff00, esattamente lo stesso di quello suggerito nella risposta, tranne per il fatto che ha anche il vantaggio di essere leggibile dall'uomo . La maggior parte degli sviluppatori preferirebbe una soluzione leggibile dall'uomo.
aroth

145

Quando chiami setBackgoundColor sovrascrive / rimuove qualsiasi risorsa di sfondo esistente, inclusi bordi, angoli, riempimento, ecc. Quello che vuoi fare è cambiare il colore della risorsa di sfondo esistente ...

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

Sperimenta con PorterDuff.Mode. * Per effetti diversi.


"sovrascrive / rimuove qualsiasi risorsa di sfondo esistente", non proprio.
Yousha Aleayoub,

2
Ho dovuto usare quanto sopra insieme a v.invalidate (); nella riga successiva.
Hashim Akhtar,

1
provato questo tempo sprecato e andato con la risposta accettata, v.getBackground () ha dato l'eccezione nullpointer e si è bloccato.
Siddarth G,

Questo più PorterDuff.Mode.SRC_IN risolto per me in modo da non perdere il bordo di sfondo.
Guilherme Carvalho,

123

Diverse scelte per farlo ...

Imposta lo sfondo sul verde:

v.setBackgroundColor(0x00FF00);

Imposta lo sfondo sul verde con Alpha :

v.setBackgroundColor(0xFF00FF00);

Imposta lo sfondo sul verde con la costante Color.GREEN:

v.setBackgroundColor(Color.GREEN);

Imposta lo sfondo sul verde definendo in Colors.xml

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

e usando:

v.setBackgroundResource(R.color.myGreen);

e:

v.setBackgroundResource(R.color.myGreenWithAlpha);

o il più lungo:

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

e:

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

getResources().getColor(...)ottenuto deprecato stackoverflow.com/questions/31842983/...
Junior Mayhé

5
C'è anche: v.setBackgroundResource(R.color.myGreen);quando si usacolors.xml
torvo

Rimosse le invalidatechiamate, come puoi vedere i setBackground... metodi lo chiamano già.
Weston,

v.setBackgroundColor(0x00FF00);è solo il loro codice che dicono non funziona. Mi aspetto anche che sia trasparente.
Weston,

35

È possibile impostare il colore esadecimale su qualsiasi risorsa con:

View.setBackgroundColor(Color.parseColor("#e7eecc"));

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

Il codice non imposta il pulsante su verde. Invece, rende il pulsante totalmente invisibile.

Spiegazione: il valore esadecimale del colore è errato. Con un valore alfa pari a zero, il colore sarà invisibile.

Il valore esadecimale corretto è 0xFF00FF00per il verde dell'opacità completa. Qualsiasi valore Alpha compreso tra 00 e FF causerebbe trasparenza.


12

e qual è il modo corretto per cambiare il colore di sfondo in qualsiasi vista?

Su qualsiasi View ? Quello che hai è corretto, anche se dovresti abbandonare la invalidate()chiamata.

Tuttavia, alcuni Viewshanno già sfondi. A Button, ad esempio, ha già uno sfondo: la faccia del pulsante stesso. Questo sfondo è un StateListDrawable, che puoi trovare android-2.1/data/res/drawable/btn_default.xmlnell'installazione dell'SDK per Android. Ciò, a sua volta, si riferisce a un mucchio di immagini bitmap a nove patch, disponibili in più densità. Dovresti clonare e modificare tutto ciò per raggiungere i tuoi obiettivi verdi.

In breve, ti verrà meglio servito a trovare un altro modello di interfaccia utente piuttosto che tentare di cambiare lo sfondo di a Button.


OK, grazie per la spiegazione degli sfondi dei pulsanti. Nove bitmap di patch ( developer.android.com/reference/android/graphics/NinePatch.html ) erano nuove per me. Voglio semplicemente cambiare il colore di qualsiasi cosa sullo schermo quando premo un pulsante. I pulsanti sono su un TextView. Tentare di cambiarne il colore, porta ai messaggi della console "Timeout attesa registrazione DDM in corso ... ActivityManager: Impossibile inviare il blocco DDM 52454151: nessun gestore definito" e una finestra di dialogo sullo schermo "l'app si è arrestata in modo imprevisto". Immagino di dover leggere di più sull'interfaccia utente. Eventuali suggerimenti sono benvenuti. Grazie.
Peter vdL,

12

Per impostare il primo colore da visualizzare sullo schermo, puoi anche farlo nel layout.xml pertinente (design migliore) aggiungendo questa proprietà alla vista pertinente:

android:background="#FF00FF00"

La domanda chiarisce che il cambio di colore deve essere dinamico.
Peter vdL


6

Uso a API min 16, obiettivo 23

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

WeekDoneButton.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorAccent));

Di solito non ci sono molti colori predefiniti. Nuovi colori possono essere definiti in res / valori / colori come descritto qui developer.android.com/samples/BasicMediaRouter/res/values/…
Krystian,



4

Questa domanda parla della modifica del colore di sfondo di una vista. In una delle risposte, la persona spiega come cambiare il colore di sfondo durante il runtime. Ovviamente esaminerai come modificare altri oggetti sullo schermo, ma questo dovrebbe darti un buon inizio almeno consentendoti di modificare il colore di sfondo della vista facendo clic sul pulsante.


3

Dichiarando con Android 6 utilizzare ContextCompact

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


2

In kotlin potresti farlo in questo modo:

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

Dov'è getColorCompat()una funzione di estensione:

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

Aggiunge il colore al valore del colore precedente, quindi ho un colore diverso.

Ciò che funziona per me è:

view.setBackgroundResource(R.color.primaryColor);

1

Lasciate supponiamo di avere un colore primario in values=>colors.xmlquanto:

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

quindi se vogliamo usare il nostro colore personalizzato in setBackgroundColor(@ColorInt int Color)allora abbiamo solo bisogno di un'annotazione @SuppressLint("ResourceAsColor")con costruttore / metodo che sarà usato come:

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

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

        ....


    }

0

Devi passare un int nell'argomento.

Primo esempio:

view.setBackgroundColor(-500136)

Secondo esempio:

int colorId = R.color.green;

view.setBackgroundResource(colorId);

0

Questo dovrebbe funzionare bene: v.setBackgroundColor(0xFF00FF00);


0

Ho provato tutti i modi sopra. Ma non ho raggiunto ciò di cui ho bisogno. Ecco il mio tentativo. Se si utilizza hexcode per il colore e si desidera impostare il colore come sfondo dell'immagine, questo è il codice di 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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.