Como definir a cor de fundo de uma View

179

Estou tentando definir a cor de plano de fundo de uma exibição (neste caso, um botão).

Eu uso este código:

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

Isso faz com que o botão desapareça da tela. O que estou fazendo de errado e qual é a maneira correta de alterar a cor do plano de fundo em qualquer Visualização?

Obrigado.

Peter vdL
fonte
1
Parece correto. Na verdade, acho que você não precisa chamar invalidate (). Quando você diz que o botão desaparece, você quer dizer literalmente ou o botão tinha texto ou uma imagem que desapareceu?
RickNotFred

Respostas:

281

Você tornou seu botão transparente. O primeiro byte é o alfa.

Experimentar v.setBackgroundColor(0xFF00FF00);

rainhut
fonte
2
A resposta de EddieB abaixo é muito melhor, pois isso remove bordas, etc., como o sublinhado de um EditText
Gelo derretido
@aroth é melhor Color.Green? Se eu quiser cores complext com argb? ... a sua resposta é obsoleto
entreg
2
@delive - Vem de novo? Color.GREEN não está obsoleto e inclui o byte alfa. Seu valor é 0xff00ff00, exatamente o mesmo que o que é sugerido na resposta, exceto que ele também tem a vantagem de ser legível . A maioria dos desenvolvedores prefere uma solução legível por humanos.
Aroth 03/08/19
145

Quando você chama setBackgoundColor, ele substitui / remove qualquer recurso em segundo plano existente, incluindo bordas, cantos, preenchimento, etc. O que você deseja fazer é alterar a cor do recurso em segundo plano existente ...

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

Experimente o PorterDuff.Mode. * Para obter efeitos diferentes.

EddieB
fonte
"sobrescreve / remove qualquer recurso em segundo plano existente", na verdade não.
Yousha Aleayoub
2
Eu tive que usar o acima, juntamente com v.invalidate (); na próxima linha.
Hashim Akhtar
1
tentou esse tempo perdido e foi com a resposta aceita, v.getBackground () deu a exceção nullpointer e travou.
Siddarth G
Isso mais o PorterDuff.Mode.SRC_IN resolvido para mim, para que eu não perdesse minha borda de plano de fundo.
Guilherme Carvalho
123

Várias opções para fazer isso ...

Defina o plano de fundo para verde:

v.setBackgroundColor(0x00FF00);

Defina o fundo para verde com Alpha :

v.setBackgroundColor(0xFF00FF00);

Defina o plano de fundo para verde com a constante Color.GREEN:

v.setBackgroundColor(Color.GREEN);

Defina o plano de fundo para a definição verde em 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);

ou o mais longo:

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

e:

v.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.myGreenWithAlpha));
Jorgesys
fonte
getResources().getColor(...)ficou obsoleto stackoverflow.com/questions/31842983/…
Junior Mayhé
5
Há também: v.setBackgroundResource(R.color.myGreen);ao usarcolors.xml
sombrio
Removidas as invalidatechamadas, como você pode ver os setBackground... métodos já chamam isso.
weston 27/02
v.setBackgroundColor(0x00FF00);é apenas o código deles que eles dizem que não está funcionando. Eu também esperaria que fosse transparente.
weston 27/02
35

Você pode definir a cor hexadecimal para qualquer recurso com:

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

O código não define o botão para verde. Em vez disso, torna o botão totalmente invisível.

Explicação: o valor hexadecimal da cor está incorreto. Com um valor Alfa igual a zero, a cor ficará invisível.

O valor hexadecimal correto é 0xFF00FF00para a opacidade total em verde. Qualquer valor alfa entre 00 e FF causaria transparência.

Malte Kosian
fonte
12

e qual é a maneira correta de alterar a cor do plano de fundo em qualquer modo de exibição?

Em algum View ? O que você tem está correto, embora você deva desligar a invalidate()ligação.

No entanto, alguns Viewsjá têm antecedentes. A Button, por exemplo, já tem um plano de fundo: a face do botão em si. Esse plano de fundo é um StateListDrawable, que você pode encontrar na android-2.1/data/res/drawable/btn_default.xmlinstalação do SDK do Android. Isso, por sua vez, refere-se a um monte de imagens bitmap de nove correções, disponíveis em várias densidades. Você precisaria clonar e modificar tudo isso para atingir seus objetivos ecológicos.

Em resumo, será melhor encontrar outro padrão de interface do usuário do que tentar alterar o plano de fundo de um Button.

CommonsWare
fonte
OK, obrigado pela explicação sobre os fundos do botão. Nove bitmaps de patch ( developer.android.com/reference/android/graphics/NinePatch.html ) eram novos para mim. Eu simplesmente quero mudar a cor de qualquer coisa na tela quando pressiono um botão. Os botões estão em um TextView. Tentar alterar a cor disso leva a mensagens do console "Tempo limite de espera do registro de envio do DDM ... ActivityManager: Não é possível enviar o pedaço do DDM 52454151: nenhum manipulador definido" e uma caixa de diálogo na tela "o aplicativo parou inesperadamente". Acho que preciso fazer mais leituras na interface do usuário. Qualquer dica bem-vinda. Obrigado.
#
12

Para definir a primeira cor a ser vista na tela, você também pode fazê-lo no layout.xml relevante (melhor design) adicionando esta propriedade à Visualização relevante:

android:background="#FF00FF00"
JustinB
fonte
A questão deixa claro que a mudança de cor precisa ser dinâmica.
precisa saber é o seguinte
11

tente adicionar:

setBackgroundColor(Color.parseColor("#FF0000"));
Arco-íris longo
fonte
6

Eu uso no API 16 min, alvo 23

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

WeekDoneButton.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorAccent));
Vostro
fonte
Geralmente, não há muitas cores padrão. Novas cores podem ser definidas em res / valores / cores, conforme descrito aqui developer.android.com/samples/BasicMediaRouter/res/values/…
Krystian
5

Você pode usar de maneira simples:

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

Esta pergunta fala sobre como alterar a cor de fundo de uma exibição. Em uma das respostas, a pessoa explica como alterar a cor do plano de fundo durante o tempo de execução. Obviamente, você analisará como modificar outros objetos na tela, mas isso deve lhe dar um bom começo, permitindo pelo menos modificar a cor de fundo da exibição no clique do botão.

jbranchaud
fonte
3

Declarando com o Android 6, use ContextCompact

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

Você pode usar de maneira simples:

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

No kotlin você pode fazer assim:

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

Onde getColorCompat()está uma função de extensão:

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

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

Adiciona cor ao valor da cor anterior, então eu tenho uma cor diferente.

O que funciona para mim é:

view.setBackgroundResource(R.color.primaryColor);
Meralon
fonte
1

Vamos supor que temos uma cor primária em values=>colors.xmlcomo:

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

portanto, se queremos usar nossa cor personalizada setBackgroundColor(@ColorInt int Color), precisamos apenas de uma anotação @SuppressLint("ResourceAsColor")com o construtor / método que será usado como:

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

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

        ....


    }
ForWebTech
fonte
0

Você deve passar um intno argumento

Primeiro exemplo:

view.setBackgroundColor(-500136)

Segundo exemplo:

int colorId = R.color.green;

view.setBackgroundResource(colorId);
David Mutenda
fonte
0

Isso deve funcionar bem: v.setBackgroundColor(0xFF00FF00);

nishanuw
fonte
0

Eu tentei de todas as maneiras acima. Mas ainda não consegui o que preciso. Aqui está a minha tentativa. Se você estiver usando o hexcode para cores e quiser definir a cor como plano de fundo da imagem, esse é o 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
fonte