스낵바의 배경색을 변경하는 방법은 무엇입니까?


101

alertDialog의 Positive click 내 DialogFragment에 스낵바가 표시됩니다. 다음은 내 코드 스 니펫입니다.

Snackbar snackbar = Snackbar.make(view, "Please enter customer name", Snackbar.LENGTH_LONG)
                .setAction("Action", null);
View sbView = snackbar.getView();
sbView.setBackgroundColor(Color.BLACK);
snackbar.show();

내 스낵바 배경색이 흰색으로 표시되는 것을 볼 수 있습니다.

dialogfragment의보기를 스낵바로 전달하고 있습니다. 배경색을 검정색으로 하시겠습니까? 어떻게 할 수 있습니까? DialogFragment에서 alertDialog를 반환하고 있습니다. 그리고 다음과 같이 대화에 설정하고있는 테마

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">

    <!-- Used for the buttons -->
    <item name="colorAccent">@color/accent</item>
    <!-- Used for the title and text -->
    <item name="android:textColorPrimary">@color/primary</item>
    <!-- Used for the background -->
    <item name="android:background">@color/white</item>
</style>

대화 상자의 배경색을 흰색으로 설정하고 있지만 스낵바에 배경색을 설정하여 재정의해야합니다.



이미 ... 난 거기에 대화 조각 +에 AlertDialog에서 스낵바를 호출하고 내가 플로팅 작업에 긍정적 인 버튼 클릭보기를 통과하고 나에게 도움이되지 것을 시도
Ajinkya

답변:


172

다음과 같이 배경색을 설정해보십시오.

sbView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.BLACK));

100 % 작동합니다!


50
당신은 할 필요가 있을지도 모릅니다snackBarView.getView().setBackgrondColor(ContextCompat.getColor(getActivity(), R.color.BLACK));
jaytj95

2
Google에서이 페이지 이상 솔루션이 작동하지 않는 것을 발견 한 경우 대신이 페이지를 시도해야 할 수 있습니다.sbView.setBackgroundColor(getResources().getColor(R.color.BLACK))
modu

@modu getResources#getColorAPI 레벨 23 (Marshmallow) 이후로 더 이상 사용되지 않으며 ContextCompat#getColor대신 사용해야합니다.
Edric

89

당신은 이렇게 할 수 있습니다

Snackbar snackbar;
snackbar = Snackbar.make(view, "Message", Snackbar.LENGTH_SHORT);
View snackBarView = snackbar.getView();
snackBarView.setBackgroundColor(yourColor);
TextView textView = (TextView) snackBarView.findViewById(android.support.design.R.id.snackbar_text);
textView.setTextColor(textColor);
snackbar.show();

1
u는 볼 수 있듯이 내가하지만 검은 색에 표시되지 정확히 같은 일 한
Ajinkya

나는이 대화로 인해 작동하지 않을 수 있으며, 테스트를위한 활동에 표시하려고, 내 프로젝트 중 하나에 동일하게 사용이
쥬 바이 르 Akber

ya 그것의 활동에 대한 작업이지만 대화 조각에서 원합니다.
Ajinkya

나는 그것 때문에 당신이 그것을 전달하는 것을보기의 생각
쥬 바이 르 Akber

20

모든 스낵바에 대한 배경색을 정의하려면 design_snackbar_background_color리소스의 어딘가에 값을 재정의하면 됩니다. 예를 들면 :

<color name="design_snackbar_background_color" tools:override="true">@color/colorPrimaryLight</color>

이 솔루션은 가장 깨끗하고 좋습니다. 감사!
AloDev

1
훌륭하게 작동합니다. colors.xml에 이것을 붙이기 만하면됩니다!
Avi Parshan 2018 년

아니. 나를 위해 일하지 않았다. 다른 솔루션도 마찬가지였습니다.
AndroidDev 2019-06-28

20

다른 답변 중 어느 것도 사용자 정의 스타일 재정의를 제공하지 않았으므로 (가장 안전한 업데이트 방법 중 하나라고 생각합니다) 여기에 내 솔루션을 게시합니다.

나는 이미 새로운 AndroidX(support design 28 ) 테마를 .

응용 프로그램이 그들이라는 사용자 지정 사용을 제공 MyAppTheme당신의를 AndroidManifest.xml:

<application
        android:name=".MyApplicationName"
        android:allowBackup="true"
        android:icon="@mipmap/icon"
        android:roundIcon="@mipmap/icon_round"
        android:label="@string/app_name"
        android:theme="@style/MyAppTheme">

values/style.xml애플리케이션에서 사용하는 테마를 재정의하는 파일을 생성합니다 (아직없는 경우) .

<style name="MyAppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimary">@color/myColorPrimary</item>
    <item name="colorPrimaryDark">@color/myColorPrimaryDark</item>
    <item name="colorAccent">@color/myColorAccent</item>
    <item name="snackbarStyle">@style/MySnackBarStyle</item>
</style>

<!-- snackbar style in res/values -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:background">@color/mySnackbarBackgroundColor</item>
</style>

values/colors.xml파일에 색상을 제공하십시오.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="myColorPrimary">#008577</color>
    <color name="myColorPrimaryDark">#00574B</color>
    <color name="myColorAccent">#D81B60</color>
    <color name="mySnackbarBackgroundColor">#D81B60</color>
</resources>

업데이트 2020

위의 솔루션은 스낵 커의 둥근 모서리를 제거하므로이 방법으로 배경을 설정하면 레거시 스낵바 디자인을 사용하므로 재료 디자인을 유지할 수 있습니다.

  1. API 21 이상을 대상으로하는 경우

교체 android:backgroundandroid:backgroundTint

<!-- snackbar style in res/values-21/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:backgroundTint">@color/mySnackbarBackgroundColor</item>
</style>
  1. 당신이 API <21 기존 플로팅 작업을 사용하기로 결정한 경우 다음 API <(21)을 대상으로하는 경우 당신은 당신의 abouve을 설정할 수 MySnackbarStyle고해상도 / 값은-21 / 폴더와 이전 남겨 - 유산 - 당신의 스타일을 고해상도 / 값 폴더.

  2. API <21을 대상으로하고이 하위 API 레벨에서도 스낵바의 재질 스타일을 원하면 다음과 같이 res / values ​​/ 에서 스낵바 스타일을 변경할 수 있습니다 .

<!-- snackbar style in res/values/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:background">@drawable/my_snackbar_background</item>
</style>

다음과 my_snackbar_background같이 공식 저장소 에서 빌리십시오 .

<!-- in res/drawable/ -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="4dp"/>
    <solid android:color="@color/mySnackbarBackgroundColor"/>
</shape>

다음은 놀이터 저장소 입니다.

여기에 이미지 설명 입력


3
이것이 가장 깨끗하고 최상의 솔루션입니다
TrackDave

그것은 snakbar의 크기를 변경합니다
William

컴파일하려면 AppTheme이 Theme.MaterialComponents에서 상속되어야합니다
A.Mamode

감사합니다 my_snackbar_background. 그것없이 Snackbar는 둥근 모서리로 그렸습니다.
CoolMind

stackoverflow.com/a/62006413/2914140에 좀 더 스타일을 추가했습니다 .
CoolMind

15

Kotlin 버전 ( 확장자 포함 ) :

파일 (예 : SnackbarExtension.kt)에 확장자를 작성하십시오.

fun Snackbar.withColor(@ColorInt colorInt: Int): Snackbar{
   this.view.setBackgroundColor(colorInt)
   return this
}

다음으로 Activity / Fragment에서 다음을 수행 할 수 있습니다.

Snackbar
  .make(coordinatorLayout, message, Snackbar.LENGTH_LONG)
  .withColor(YOUR_COLOR)
  .show()

이 답변과 마찬가지로 텍스트 색상도 추가했습니다. fun Snackbar.withColor (@ColorInt backgroundColor : Int, @ColorInt textColor : Int) : Snackbar {this.view.setBackgroundColor (backgroundColor) this.view.findViewById <TextView> ( android.support.design.R.id.snackbar_text) .setTextColor (textColor) return this}
willcwf

13

벨로우 코드는 메시지의 텍스트 색상을 변경하는 데 유용합니다.

Snackbar snackbar = Snackbar.make(rootView, "Enter Your Message",Snackbar.LENGTH_SHORT);
View view = snackbar.getView();
TextView tv = (TextView)view.findViewById(android.support.design.R.id.snackbar_text);
tv.setTextColor(Color.RED);
snackbar.show();

두 번째 방법 : 활동 주제를 변경하여 색상을 변경할 수도 있습니다.


7

너무 늦었지만 누군가가 여전히 도움이 필요한 경우. 다음은 작업 솔루션입니다.

      Snackbar snackbar = Snackbar.make(mainView, text, Snackbar.LENGTH_LONG);
    View snackBarView = snackbar.getView();
    snackBarView.setBackgroundColor(context.getResources().getColor(R.color.btn_background_color));
    snackbar.show();

4

xamarin android로 작업하는 동안 ContextCompat.GetColor ()가 Int를 반환하지만 setBackgroundColor ()는 Color 유형의 Parameter를 예상한다는 것을 알았습니다. 그래서 여기 내 xamarin 안드로이드 프로젝트에서 어떻게 작동하는지 보여줍니다.

Snackbar snackbarview =  Snackbar.Make(toolbar, message, Snackbar.LengthLong);
View snckView = snackbarview.View;                
snckView.SetBackgroundColor(Color.ParseColor(GetString(Resource.Color.colorPrimary)));
snackbarview.Show();

View snckView = snackbarview.View;대신 snackbar.getView();사용할 수 없지만 ParseColor작동 하지 않는 Xamarin의 경우 +1입니다 .
Cfun

@Cfun 문제를 좀 더 설명해 주시면 도와 드릴 수 있습니다.
SATYAJEET RANJAN

System.Drawing.Color.ParseColor대신 사용 했습니다 Android.Graphics.Color.ParseColor. 이제 "현재 컨텍스트에 'getstring'이라는 이름이 없습니다."
Cfun

@Cfun 활동이나 조각에서이 오류가 발생했거나 다른 클래스에서 getString ()을 호출하고 있습니까?
SATYAJEET RANJAN

다른 클래스에서 호출하고 있습니다.
Cfun


2

나는 앱을 통해 쉽게 맞춤형 컬러 스낵바를 만들 수 있도록 약간의 유틸리티 클래스를 만들었습니다.

package com.yourapppackage.yourapp;

import android.support.design.widget.Snackbar;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class SnackbarUtils {

    private int BACKGROUND_COLOR;
    private int TEXT_COLOR;
    private int BUTTON_COLOR;
    private String TEXT;


    public SnackbarUtils(String aText, int aBgColor, int aTextColor, int aButtonColor){
        this.TEXT = aText;
        this.BACKGROUND_COLOR = aBgColor;
        this.TEXT_COLOR = aTextColor;
        this.BUTTON_COLOR = aButtonColor;
    }

    public Snackbar snackieBar(){
        Snackbar snackie = Snackbar.make(MainActivity.getInstance().findViewById(android.R.id.content), TEXT, Snackbar.LENGTH_LONG);
        View snackView = snackie.getView();
        TextView snackViewText = (TextView) snackView.findViewById(android.support.design.R.id.snackbar_text);
        Button snackViewButton = (Button) snackView.findViewById(android.support.design.R.id.snackbar_action);
        snackView.setBackgroundColor(BACKGROUND_COLOR);
        snackViewText.setTextColor(TEXT_COLOR);
        snackViewButton.setTextColor(BUTTON_COLOR);
        return snackie;
    }
}

그런 다음 앱에서 다음과 같이 사용하십시오.

new SnackbarUtils("This is the text displayed", Color.RED, Color.BLACK, Color.YELLOW).snackieBar().setAction("OTAY", v -> { 
     //donothing
     }).show();

2

유틸리티 클래스에 넣으십시오.

public class Utility {
    public static void showSnackBar(Context context, View view, String text) {
        Snackbar sb = Snackbar.make(view, text, Snackbar.LENGTH_SHORT);
        sb.getView().setBackgroundColor(ContextCompat.getColor(context, R.color.colorAccent));
        sb.show();
    }
}

다음과 같이 사용 :

Utility.showSnackBar(getApplicationContext(), findViewById(android.R.id.content), "Add success!!!");

2

기본적으로 제공된 솔루션에는 한 가지 단점이 있습니다. 그들은 스낵바의 모양을 변경하고 반경을 제거합니다.

개인적으로 그런 걸 선호 해

val snackbar = Snackbar.make(view, text, Snackbar.LENGTH_LONG);
val view = snackbar.getView();
val color = view.resources.getColor(colorId)
view.background.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)

1

다른 솔루션은 실제로 저에게 효과가 없었습니다. Snackbar의 배경색 만 설정하면 TextView 및 Button 아래의 레이아웃이 기본 색상으로 설정되었습니다. TextView의 배경을 설정하면 SnackBar가 표시된 후 약간 깜박입니다. 버튼 주변의 레이아웃은 여전히 ​​기본 색상입니다.

결국 나에게 가장 좋은 방법은 TextView의 부모 (SnackbarContentLayout)의 배경색을 변경하는 것임을 알았습니다. 이제 전체 스낵바의 색상이 제대로 표시되고 표시 될 때 깜박이지 않습니다.

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

1

setBackgroundResource() 잘 작동합니다.

Snackbar snackbar = Snackbar.make(view, text, Snackbar.LENGTH_LONG);
View sbView = snackbar.getView();
sbView.setBackgroundResource(R.color.background);
snackbar.show();

1

내 프로젝트에서 setBackgroundColor ()를 찾지 못한 이유를 모르겠습니다. 그것이 내가 확장 기능을 만든 이유이며 지금은 괜찮습니다.

fun View.showSnackBar(message: String) {
    val snackBar = Snackbar.make(this, message, Snackbar.LENGTH_LONG)
    snackBar.setBackgroundTint(ContextCompat.getColor(this.context, R.color.colorAccent))
    snackBar.show()
}

우는 소리처럼 불러

activity_login.xml

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/login_holder_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   // your UI

</FrameLayout>

LoginActivity.kt

login_holder_layout.showSnackBar("Invalid Email") 

0
public class CustomBar {

public static void show(View view, String message, boolean isLong) {
    Snackbar s = Snackbar.make(view, message, isLong ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT);
    s.getView().setBackgroundColor(ContextCompat.getColor(view.getContext(), R.color.red_900));
    s.show();
}

public static void show(View view, @StringRes int message, boolean isLong) {
    Snackbar s = Snackbar.make(view, message, isLong ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT);
    s.getView().setBackgroundColor(ContextCompat.getColor(view.getContext(), R.color.red_900));
    s.show();
}

}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.