web-dev-qa-db-fra.com

Le thème personnalisé interfère avec la couleur de fond de la barre

En essayant la nouvelle bibliothèque de support de conception, j'ai ajouté un snackbar; mais contrairement à son arrière-plan principal, la zone de texte n'est pas colorée avec la valeur par défaut de #323232. Au lieu de cela, il ressemble à comme ceci . Il semble prendre sa couleur de la valeur Android:background définie dans le thème personnalisé dans mon styles.xml, qui se présente comme suit:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="Android:background">#4f4f5e</item>
    ...
</style>

Si j'essaie de le colorier avec force 

View snackbarView = snackbar.getView(); 
snackbarView.setBackgroundColor(Color.YELLOW);

cela n'affecte que l'arrière-plan principal, comme ceci , et l'arrière-plan du texte est toujours coloré par le thème personnalisé. Existe-t-il un moyen de conserver mon thème personnalisé et d’avoir un snack-bar standard? Merci!

13
Kuboå

Pour changer la couleur d'arrière-plan de la barre, vous pouvez effectuer le code suivant:

Snackbar snack = Snackbar.make(...);
ViewGroup group = (ViewGroup) snack.getView();
group.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.red));
snack.show();

Au lieu de rouge, vous pouvez utiliser la couleur par défaut du Snackbar: # 323232

17
agirardello

Le snackbar contient un TextView, vous devez donc changer la couleur de fond pour le deux, le snackbar comme vous l'avez déjà fait, puis le TextView comme ceci: 

View snackbarView = snackbar.getView(); 
TextView textView = (TextView)snackbarView.findViewById(Android.support.design.R.id.snackbar_text); 
textView.setBackgroundColor(Color.YELLOW);
7

.setBackgroundColor vous permet de changer la couleur de fond du snackbar

msnackBar.setBackgroundColor(Color.parseColor("#009688"));

ou

 msnackBar.setBackgroundColor(getResources().getColor(R.color.BLUE)););

Here est un didacticiel complet sur l'utilisation de snackbar à l'aide de la bibliothèque de support de conception.

7
Pacific P. Regmi

Voici un exemple complet:

Snackbar snack = Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null);
                ViewGroup group = (ViewGroup) snack.getView();
                group.setBackgroundColor(ContextCompat.getColor(MainActivity.this, R.color.blue));
                snack.show();

remplacez MainActivity.this par votre activité actuelle ou getAppContext ()

2
Joolah

Vous pouvez simplement créer votre propre classe Snackbar et simuler la méthode make de Snackbar. Pour ce faire, il vous suffit d'utiliser cette classe au lieu du widget snackbar d'Android.

Snackbar.class

import Android.graphics.Color;
import Android.support.annotation.IntDef;
import Android.support.annotation.IntRange;
import Android.support.annotation.NonNull;
import Android.support.design.widget.CoordinatorLayout;
import Android.support.design.widget.FloatingActionButton;
import Android.view.View;

import Java.lang.annotation.Retention;
import Java.lang.annotation.RetentionPolicy;

public class Snackbar {

    /** Snackbar's lengths **/
    public static final int LENGTH_SHORT = Android.support.design.widget.Snackbar.LENGTH_SHORT;
    public static final int LENGTH_LONG = Android.support.design.widget.Snackbar.LENGTH_LONG;
    public static final int LENGTH_INDEFINITE = Android.support.design.widget.Snackbar.LENGTH_INDEFINITE;

    @NonNull
    public static Android.support.design.widget.Snackbar make(@NonNull View view, @NonNull CharSequence text,
                                                              @Duration int duration) {
        Android.support.design.widget.Snackbar snackbar = Android.support.design.widget.Snackbar.make(view, text, duration);
        // TODO: This is where you have to customize your snackbar
        snackbar.getView().setBackgroundColor(Color.RED);
        return snackbar;
    }

    @NonNull
    public static Android.support.design.widget.Snackbar make(@NonNull View view, @StringRes int resId, @Duration int duration) {
        return make(view, view.getResources().getText(resId), duration);
    }

    // Optional
    @IntDef({LENGTH_INDEFINITE, LENGTH_SHORT, LENGTH_LONG})
    @IntRange(from = 1)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Duration {}

}

Utilisation:

// WARNING: Make sure you're using your snackbar's package
import com.mypackage.custom_views.Snackbar;

public class MyActivity extends Activity {
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        Snackbar.make(view, R.string.my_msg, Snackbar.LENGTH_LONG).show();
    }
}

J'espère que cela t'aides!

2
Antonio

Vous pouvez utiliser cette bibliothèque: https://github.com/SandroMachado/restaurant

new Restaurant(MainActivity.this, "Snackbar with custom background and text color", Snackbar.LENGTH_LONG)
    .setBackgroundColor(Color.GRAY)
    .show();

Disclaimer: J'ai fait la bibliothèque.

1
Sandro Machado

Cet effet se produit lorsque l'attribut Android:background est défini dans le style.

Si vous supprimez cette option, cela affectera bien sûr toutes les mises en page de votre application, mais snackbar sera corrigé.

1
jakubbialkowski

C'est comme ça que j'utilise un snack personnalisé

  Snackbar snackbar_network = Snackbar.make(rLayout, "Your Message", Snackbar.LENGTH_SHORT)
                        .setAction("EXIT", new View.OnClickListener() {
                            @Override
                            public void onClick(final View v) {


                                  finish();

                            }
                        });

Action Text Color

 snackbar_network.setActionTextColor(Color.RED);

Action Message Couleur du texte

  final View sbView = snackbar_network.getView();
                final TextView tv = (TextView) sbView.findViewById(Android.support.design.R.id.snackbar_text);
                tv.setTextColor(Color.YELLOW);

Définir l'arrière-plan du snack-bar  

sbView.setBackgroundColor(ContextCompat.getColor(MapsActivity.this, R.color.black));

        snackbar_network.show();
1
sivaBE35

Cela fonctionne pour moi:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.ll);
        Snackbar snackbar = Snackbar.make(lineatLayout, "TEXT", Snackbar.LENGTH_LONG);
        ViewGroup group = (ViewGroup) snackbar.getView();
        group.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.yourColor));
        TextView textView = (TextView) group.findViewById(Android.support.design.R.id.snackbar_text);
        textView.setTextColor(ContextCompat.getColor(this, R.color.yor collor));

        snackbar.show();
0
Douglas

J'ai également fait face à un problème similaire et, malheureusement, aucune solution ne fonctionne pour moi. Par conséquent, j'écris ma propre solution dans laquelle je règle également la couleur d'arrière-plan pour la vue parent. 

    TextView snackbarTextView = snackbar.getView().findViewById(Android.support.design.R.id.snackbar_text);
    snackbarTextView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorPrimary));

    ViewParent parentView = snackbarTextView.getParent();
    if (parentView instanceof View) {
        ((View) parentView).setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorPrimary));
    }

    View snackbarView = snackbar.getView();
    snackbarView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorPrimary));

    snackbar.show();
0
Saurabh Khare