Пользовательская тема препятствует цвету фона snackbar

Попробовав новую библиотеку поддержки дизайна, я добавил закусочную; Но в отличие от основного фона, текстовая область не имеет значения по умолчанию #323232 . Вместо этого он выглядит так . Он, кажется, берет свой цвет от значения android:background определенного в пользовательской теме в моих styles.xml , который выглядит следующим образом:

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

Если я попытаюсь сильно покрасить его

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

Это влияет только на основной фон, как этот , и текстовый фон по-прежнему окрашивается специальной темой. Есть ли способ сохранить мою собственную тему и иметь стандартную закусочную? Благодаря!

Solutions Collecting From Web of "Пользовательская тема препятствует цвету фона snackbar"

Чтобы изменить цвет фона Snackbar, вы можете сделать следующее из кода:

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

Вместо красного цвета вы можете использовать цвет по умолчанию для Snackbar: # 323232

.setBackgroundColor позволяет вам изменять цвет фона в закусочной

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

или

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

Вот полный учебник по использованию snackbar с использованием библиотеки поддержки дизайна.

Закусочная содержит TextView, поэтому вам нужно изменить цвет фона для обоих, закуски так, как вы уже сделали, а затем TextView:

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

Вот полный пример:

 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 на вашу текущую активность или getAppContext ()

Вы можете просто создать свой собственный класс Snackbar и смоделировать метод make snackbar. Выполняя это, вы просто должны использовать этот класс вместо виджета скелетной корзины.

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

Использование:

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

Надеюсь это поможет!

Этот эффект происходит, когда в атрибуте style android:background .

Удаление, которое, конечно же, повлияет на все макеты в вашем приложении, но snackbar будет исправлена.

Вы можете использовать эту библиотеку: https://github.com/SandroMachado/restaurant

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

Отказ от ответственности: я создал библиотеку.

Это то, как я использую пользовательские 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(); } }); 

Цвет текста действия

  snackbar_network.setActionTextColor(Color.RED); 

Цвет текста сообщения

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

Установить фонарь закуски

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

Так работает для меня:

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