it-swarm.com.de

Benutzerdefiniertes Thema greift in die Snackbar-Hintergrundfarbe ein

Ich probierte die neue Design Support Library aus und fügte eine Snackbar hinzu. Im Gegensatz zum Haupthintergrund ist der Textbereich jedoch nicht mit dem Standardwert #323232 eingefärbt. Stattdessen sieht es so aus. Es scheint seine Farbe von dem Android:background-Wert zu nehmen, der im benutzerdefinierten Thema in meinem styles.xml definiert ist. Dieser Wert lautet wie folgt:

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

Wenn ich versuche, es mit Gewalt zu bemalen 

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

es wirkt sich nur auf den Haupthintergrund wie folgt aus, und der Texthintergrund wird immer noch durch das benutzerdefinierte Design farbig dargestellt. Gibt es eine Möglichkeit, mein benutzerdefiniertes Thema beizubehalten und eine Standard-Snackbar zu haben? Vielen Dank!

13
Kuboå

Um die Hintergrundfarbe der Snackbar zu ändern, können Sie Folgendes aus dem Code heraus tun:

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

Anstelle von Rot können Sie die Standardfarbe der Snackbar verwenden: # 323232

17
agirardello

Die Snackbar enthält eine TextView. Sie müssen also die Hintergrundfarbe für beide, die Snackbar wie zuvor ändern, und dann die TextView wie folgt ändern: 

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

Mit .setBackgroundColor können Sie die Hintergrundfarbe der Snackbar ändern

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

oder

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

Here ist ein komplettes Tutorial zur Verwendung der Snackbar mit Hilfe der Design-Support-Bibliothek.

7

Hier ist ein komplettes Beispiel:

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

MainActivity.this mit Ihrer aktuellen Aktivität oder getAppContext () ersetzen

2
Joolah

Sie können einfach eine eigene Snackbar-Klasse erstellen und die Methode zum Erstellen von Snackbar simulieren. Dazu müssen Sie nur diese Klasse anstelle des Android-Widget für die Snackbar verwenden.

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 {}

}

Benutzen:

// 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();
    }
}

Hoffe das hilft!

2
Antonio

Sie können diese Bibliothek verwenden: https://github.com/SandroMachado/restaurant

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

Haftungsausschluss: Ich habe die Bibliothek gemacht.

1
Sandro Machado

Dieser Effekt tritt auf, wenn im Stilattribut Android:background festgelegt ist.

Wenn Sie das entfernen, wirkt sich dies natürlich auf alle Layouts in Ihrer Anwendung aus. Die Snackbar wird jedoch behoben.

1
jakubbialkowski

so verwende ich benutzerdefinierte snackbar

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


                                  finish();

                            }
                        });

Aktionstextfarbe

 snackbar_network.setActionTextColor(Color.RED);

Textfarbe für Aktionsnachrichten

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

Snackbar-Hintergrund setzen  

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

        snackbar_network.show();
1
sivaBE35

Funktioniert für mich so:

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

Ich hatte auch ein ähnliches Problem und leider keine Lösung für mich. Daher schreibe ich meine eigene Lösung, bei der ich auch die Hintergrundfarbe für die übergeordnete Ansicht festlegen konnte. 

    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