Подтвердить что ты не робот

Пользовательская тема препятствует цвету фона 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);

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

или

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Вы можете просто создать свой собственный класс Snackbar и имитировать метод Snackbar make. Для этого вам просто нужно использовать этот класс, а не виджет виджета для 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 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 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();
    }
}

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

Работает для меня таким образом:

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

Ответ 10

Я также столкнулся с подобной проблемой, и, к сожалению, для меня не работает решение. Поэтому я пишу свое собственное решение, где я устанавливаю цвет фона для родительского представления.

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

Ответ 11

Ни одно из других решений не помогло мне. Если я только установил цвет фона Snackbar, макет под TextView и Button был в цвете по умолчанию. Если я установил фон TextView, он немного мигнул после того, как был показан SnackBar. А раскладка вокруг кнопки все еще была в цвете по умолчанию.

В конце я узнал, что лучший способ для меня - это изменить цвет фона родителя TextView (SnackbarContentLayout). Теперь весь Snackbar окрашен должным образом, и он не мигает, когда появляется.

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