Como mudar a cor de fundo da lanchonete?


101

Estou mostrando a barra de ferramentas em DialogFragment Dentro do clique positivo de alertDialog. Aqui está meu trecho de código.

Snackbar snackbar = Snackbar.make(view, "Please enter customer name", Snackbar.LENGTH_LONG)
                .setAction("Action", null);
View sbView = snackbar.getView();
sbView.setBackgroundColor(Color.BLACK);
snackbar.show();

Como você pode ver, a cor de fundo do meu snack-bar mostra a cor branca

Estou passando a visualização do fragmento de diálogo para a barra de ferramentas. Eu quero a cor de fundo preta? Como posso fazer isso? Estou retornando alertDialog no DialogFragment. E o tema que estou definindo para o diálogo é o seguinte

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">

    <!-- Used for the buttons -->
    <item name="colorAccent">@color/accent</item>
    <!-- Used for the title and text -->
    <item name="android:textColorPrimary">@color/primary</item>
    <!-- Used for the background -->
    <item name="android:background">@color/white</item>
</style>

Embora eu esteja definindo a cor de fundo como branco para a caixa de diálogo, ela deve ser substituída definindo a cor de fundo para a barra de ferramentas.



tentei isso já não está me ajudando ... estou ligando para a lanchonete do fragmento de diálogo + alertDialog nela e estou passando a visualização de clique do botão positivo para a
lanchonete

Respostas:


171

Tente definir a cor de fundo como esta:

sbView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.BLACK));

Vai funcionar 100%!


50
você pode precisar fazersnackBarView.getView().setBackgrondColor(ContextCompat.getColor(getActivity(), R.color.BLACK));
jaytj95

2
Se você achou esta página do Google e a solução acima não funcionou para você, pode ser necessário tentar esta:sbView.setBackgroundColor(getResources().getColor(R.color.BLACK))
modu

@modu Observe que getResources#getColorestá obsoleto desde o nível 23 da API (Marshmallow) e ContextCompat#getColordeve ser usado em seu lugar.
Edric,

89

você pode fazer assim

Snackbar snackbar;
snackbar = Snackbar.make(view, "Message", Snackbar.LENGTH_SHORT);
View snackBarView = snackbar.getView();
snackBarView.setBackgroundColor(yourColor);
TextView textView = (TextView) snackBarView.findViewById(android.support.design.R.id.snackbar_text);
textView.setTextColor(textColor);
snackbar.show();

1
como você pode ver, eu fiz exatamente a mesma coisa, mas não
apareceu

Eu usei o mesmo em um de meu projeto, tente exibi-lo em atividade para teste, pode ser que não esteja funcionando devido ao diálogo
Zubair Akber

ya está trabalhando na atividade, mas eu quero no fragmento de diálogo.
Ajinkya

Acho que é por causa da sua visão que você está passando para ele
Zubair Akber

20

Se você quiser definir uma cor de fundo para todos os seus Snackbars, basta substituir o design_snackbar_background_color valor em algum lugar dos seus recursos. Por exemplo:

<color name="design_snackbar_background_color" tools:override="true">@color/colorPrimaryLight</color>

Esta solução é a mais limpa e agradável. Obrigado!
AloDev

1
Funciona muito bem, basta colar em colors.xml e pronto!
Avi Parshan,

Não. Não funcionou para mim. Nem qualquer uma das outras soluções.
AndroidDev

20

Como nenhuma das outras respostas forneceu uma substituição de estilo personalizado (que considero uma das formas de atualização mais seguras de fazer isso), posto aqui minha solução.

Eu posto uma solução que já aborda o tema new AndroidX( support design 28).

Desde que seu aplicativo use um personalizado chamado MyAppThemeem AndroidManifest.xml:

<application
        android:name=".MyApplicationName"
        android:allowBackup="true"
        android:icon="@mipmap/icon"
        android:roundIcon="@mipmap/icon_round"
        android:label="@string/app_name"
        android:theme="@style/MyAppTheme">

Crie (se ainda não o fez) values/style.xmlsubstituindo o tema usado pelo seu aplicativo:

<style name="MyAppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimary">@color/myColorPrimary</item>
    <item name="colorPrimaryDark">@color/myColorPrimaryDark</item>
    <item name="colorAccent">@color/myColorAccent</item>
    <item name="snackbarStyle">@style/MySnackBarStyle</item>
</style>

<!-- snackbar style in res/values -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:background">@color/mySnackbarBackgroundColor</item>
</style>

e forneça suas cores em seu values/colors.xmlarquivo

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="myColorPrimary">#008577</color>
    <color name="myColorPrimaryDark">#00574B</color>
    <color name="myColorAccent">#D81B60</color>
    <color name="mySnackbarBackgroundColor">#D81B60</color>
</resources>

ATUALIZAÇÃO 2020

Como a solução acima remove o canto arredondado do fundo do lanche, definir o plano de fundo dessa forma usa o design de barra de lanche legado, se você quiser preservar o design do material, pode.

  1. Se você tem como alvo a API 21+

substituir android:backgroundcomandroid:backgroundTint

<!-- snackbar style in res/values-21/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:backgroundTint">@color/mySnackbarBackgroundColor</item>
</style>
  1. Se você está visando API <21, então se você decidir usar o snackbar legado para API <21, você pode definir seu abouve MySnackbarStyleem res / values-21 / folder e deixar o estilo anterior - legacy - em sua pasta res / values .

  2. Se você tem como alvo a API <21 e deseja ter o estilo de material da lanchonete também nesses níveis de API mais baixos, você pode alterar o estilo da lanchonete em seus res / valores / desta forma:

<!-- snackbar style in res/values/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:background">@drawable/my_snackbar_background</item>
</style>

e peça emprestado my_snackbar_backgrounddo repositório oficial , desta forma:

<!-- in res/drawable/ -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="4dp"/>
    <solid android:color="@color/mySnackbarBackgroundColor"/>
</shape>

Aqui está um repositório de playground .

insira a descrição da imagem aqui


3
Esta é a solução mais limpa e melhor
TrackDave

É mudar o tamanho do snakbar
William

Observe que seu AppTheme deve ser herdado de Theme.MaterialComponents para compilar
A.Mamode

Obrigado por my_snackbar_background. Sem ele, o Snackbar desenhou com cantos arredondados.
CoolMind

Adicionei um pouco mais de estilo em stackoverflow.com/a/62006413/2914140 .
CoolMind

15

Versão Kotlin (com extensão ):

Crie em um arquivo (por exemplo, SnackbarExtension.kt) uma extensão:

fun Snackbar.withColor(@ColorInt colorInt: Int): Snackbar{
   this.view.setBackgroundColor(colorInt)
   return this
}

Em seguida, em sua Atividade / Fragmento, você poderá fazer o seguinte:

Snackbar
  .make(coordinatorLayout, message, Snackbar.LENGTH_LONG)
  .withColor(YOUR_COLOR)
  .show()

Realmente como esta resposta, eu adicionei a coloração de texto também: fun Snackbar.withColor (@ColorInt backgroundColor: Int, @ColorInt textColor: Int): Snackbar {this.view.setBackgroundColor (backgroundColor) this.view.findViewById <TextView> ( android.support.design.R.id.snackbar_text) .setTextColor (textColor) retornar isso}
willcwf

13

O código abaixo é útil para alterar a cor do texto da mensagem.

Snackbar snackbar = Snackbar.make(rootView, "Enter Your Message",Snackbar.LENGTH_SHORT);
View view = snackbar.getView();
TextView tv = (TextView)view.findViewById(android.support.design.R.id.snackbar_text);
tv.setTextColor(Color.RED);
snackbar.show();

Segunda maneira: Você pode mudar a cor mudando o tema da atividade também.


7

É tarde demais, mas caso alguém ainda precise de ajuda. Aqui está a solução de trabalho.

      Snackbar snackbar = Snackbar.make(mainView, text, Snackbar.LENGTH_LONG);
    View snackBarView = snackbar.getView();
    snackBarView.setBackgroundColor(context.getResources().getColor(R.color.btn_background_color));
    snackbar.show();

4

Enquanto trabalhava com o xamarin android, descobri que ContextCompat.GetColor () retorna Int, mas setBackgroundColor () espera um parâmetro do tipo Color. Então, aqui está como eu fiz isso funcionar no meu projeto xamarin android.

Snackbar snackbarview =  Snackbar.Make(toolbar, message, Snackbar.LengthLong);
View snckView = snackbarview.View;                
snckView.SetBackgroundColor(Color.ParseColor(GetString(Resource.Color.colorPrimary)));
snackbarview.Show();

+1 para Xamarin em View snckView = snackbarview.View;vez do snackbar.getView();que não está disponível, mas ParseColornão está funcionando.
Cfun

@Cfun Você pode explicar seu problema um pouco mais, para que eu possa ajudá-lo com ele.
SATYAJEET RANJAN

Meu mau eu usei em System.Drawing.Color.ParseColorvez de Android.Graphics.Color.ParseColor. agora tenho: "o nome 'getstring' não existe no contexto atual"
Cfun

@Cfun Você está recebendo este erro em uma atividade ou fragmento ou está chamando getString () em alguma outra classe?
SATYAJEET RANJAN

Eu estou chamando isso em alguma outra classe.
Cfun


2

Eu fiz uma pequena aula de utilitários para que eu possa facilmente fazer lanchonetes coloridas personalizadas por meio do aplicativo.

package com.yourapppackage.yourapp;

import android.support.design.widget.Snackbar;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class SnackbarUtils {

    private int BACKGROUND_COLOR;
    private int TEXT_COLOR;
    private int BUTTON_COLOR;
    private String TEXT;


    public SnackbarUtils(String aText, int aBgColor, int aTextColor, int aButtonColor){
        this.TEXT = aText;
        this.BACKGROUND_COLOR = aBgColor;
        this.TEXT_COLOR = aTextColor;
        this.BUTTON_COLOR = aButtonColor;
    }

    public Snackbar snackieBar(){
        Snackbar snackie = Snackbar.make(MainActivity.getInstance().findViewById(android.R.id.content), TEXT, Snackbar.LENGTH_LONG);
        View snackView = snackie.getView();
        TextView snackViewText = (TextView) snackView.findViewById(android.support.design.R.id.snackbar_text);
        Button snackViewButton = (Button) snackView.findViewById(android.support.design.R.id.snackbar_action);
        snackView.setBackgroundColor(BACKGROUND_COLOR);
        snackViewText.setTextColor(TEXT_COLOR);
        snackViewButton.setTextColor(BUTTON_COLOR);
        return snackie;
    }
}

em seguida, para usá-lo, como este em qualquer lugar do aplicativo:

new SnackbarUtils("This is the text displayed", Color.RED, Color.BLACK, Color.YELLOW).snackieBar().setAction("OTAY", v -> { 
     //donothing
     }).show();

2

Coloque-o em uma classe de utilitário:

public class Utility {
    public static void showSnackBar(Context context, View view, String text) {
        Snackbar sb = Snackbar.make(view, text, Snackbar.LENGTH_SHORT);
        sb.getView().setBackgroundColor(ContextCompat.getColor(context, R.color.colorAccent));
        sb.show();
    }
}

Usando assim:

Utility.showSnackBar(getApplicationContext(), findViewById(android.R.id.content), "Add success!!!");

2

Basicamente, as soluções fornecidas têm uma desvantagem. Eles mudam a forma de snackbar e removem o raio.

Pessoalmente, prefiro algo assim

val snackbar = Snackbar.make(view, text, Snackbar.LENGTH_LONG);
val view = snackbar.getView();
val color = view.resources.getColor(colorId)
view.background.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)

1

Nenhuma das outras soluções realmente funcionou para mim. Se eu definir apenas a cor de fundo do Snackbar, o layout em TextView e Button estará na cor padrão. Se eu definir o fundo do TextView, ele piscará um pouco depois que SnackBar for mostrado. E o layout ao redor do botão ainda estava na cor padrão.

No final, descobri que a melhor maneira para mim é mudar a cor de fundo do pai do TextView (SnackbarContentLayout). Agora o Snackbar inteiro está colorido corretamente e não pisca quando aparece.

snack = Snackbar.make(view, text, duration)
View view = snack.getView();
view.setBackgroundColor(BACKGROUND_COLOR);
TextView tv = view.findViewById(android.support.design.R.id.snackbar_text);
tv.setTextColor(TEXT_COLOR);
((SnackbarContentLayout) tv.getParent()).setBackgroundColor(BACKGROUND_COLOR);

1

setBackgroundResource() funciona tão bem.

Snackbar snackbar = Snackbar.make(view, text, Snackbar.LENGTH_LONG);
View sbView = snackbar.getView();
sbView.setBackgroundResource(R.color.background);
snackbar.show();

1

Não sei por que setBackgroundColor () não encontrou em meu projeto. É por isso que criei uma função de extensão e ela está bem agora.

fun View.showSnackBar(message: String) {
    val snackBar = Snackbar.make(this, message, Snackbar.LENGTH_LONG)
    snackBar.setBackgroundTint(ContextCompat.getColor(this.context, R.color.colorAccent))
    snackBar.show()
}

e chamá-lo como abaixo

activity_login.xml

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/login_holder_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   // your UI

</FrameLayout>

LoginActivity.kt

login_holder_layout.showSnackBar("Invalid Email") 

0
public class CustomBar {

public static void show(View view, String message, boolean isLong) {
    Snackbar s = Snackbar.make(view, message, isLong ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT);
    s.getView().setBackgroundColor(ContextCompat.getColor(view.getContext(), R.color.red_900));
    s.show();
}

public static void show(View view, @StringRes int message, boolean isLong) {
    Snackbar s = Snackbar.make(view, message, isLong ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT);
    s.getView().setBackgroundColor(ContextCompat.getColor(view.getContext(), R.color.red_900));
    s.show();
}

}

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.