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