স্নাকবারের পটভূমির রঙ কীভাবে পরিবর্তন করবেন?


103

সতর্কতা ডায়ালগের ইতিবাচক ক্লিকের মধ্যে আমি ডায়ালগফ্র্যাগমেন্টে স্নাকবার দেখছি। এখানে আমার কোড স্নিপেট।

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

আপনি দেখতে পাচ্ছেন যে আমার স্নাকবারগুলি ব্যাকগ্রাউন্ডের রঙ সাদা রঙ দেখাচ্ছে showing

আমি ডায়লগফ্র্যাগমেন্টের দর্শনটি স্নাকবারে দিয়ে যাচ্ছি। আমি ব্যাকগ্রাউন্ড কালার চাই? কিভাবে আমি এটি করতে পারব? আমি ডায়ালগফ্রেগমেন্টে সতর্কতা ডায়ালগ ফিরিয়ে দিচ্ছি। এবং আমি যে থিমটি সংলাপে সেট করছি তা অনুসরণ হিসাবে

<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 থেকে জলখাবার বার কলিং এবং আমি snackbar ইতিবাচক বাটনে ক্লিক দৃশ্য ক্ষণস্থায়ী করছি
আজিঙ্কা

উত্তর:


173

ব্যাকগ্রাউন্ড রঙ সেট করার চেষ্টা করুন:

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

এটি কাজ করবে 100%!


51
আপনার দরকার হতে পারেsnackBarView.getView().setBackgrondColor(ContextCompat.getColor(getActivity(), R.color.BLACK));
jaytj95

4
আপনি যদি এই পৃষ্ঠাটি গুগল থেকে পেয়ে থাকেন এবং উপরের সমাধানটি আপনার পক্ষে কাজ করে না, তবে পরিবর্তে আপনার এটি চেষ্টা করার প্রয়োজন হতে পারে:sbView.setBackgroundColor(getResources().getColor(R.color.BLACK))
Modu

@ এমডিউ নোট যা getResources#getColorএপিআই স্তরের 23 (মার্শমালো) থেকে অবচয় করা হয়েছে এবং ContextCompat#getColorপরিবর্তে ব্যবহার করা উচিত।
এড্রিক

90

আপনি এটি এইভাবে করতে পারেন

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

4
যেমন আপনি দেখতে পাচ্ছেন আমি ঠিক একই জিনিসটি করেছি তবে এটি কালো রঙে দেখাচ্ছে না
আজিংক্যা

আমি আমার প্রকল্পের একটিতে এটি ব্যবহার করেছি, এটি পরীক্ষার জন্য ক্রিয়াকলাপে প্রদর্শনের চেষ্টা করবো, হতে পারে এটি সংলাপের কারণে কাজ করছে না
জুবায়ের আকবার

হ্যাঁ এটি কার্যকলাপে কাজ করছে তবে আমি এটি ডায়ালগ খণ্ডে চাই।
আজিংক্যা

আমি মনে করি এটি আপনার দৃষ্টিভঙ্গির কারণেই আপনি এর কাছে চলে
যাচ্ছেন

20

আপনি যদি আপনার সমস্ত স্নাকবারের জন্য একটি পটভূমি রঙ নির্ধারণ করতে চান তবে design_snackbar_background_colorআপনার সংস্থানগুলির যে কোনও জায়গায় মানটি ওভাররাইড করুন । উদাহরণ স্বরূপ:

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

এই সমাধানটি সবচেয়ে পরিষ্কার এবং সুন্দর। ধন্যবাদ!
আলোদেব

4
দুর্দান্ত কাজ করে, কেবল রং.এক্সএমএলে এটি আটকে দিন এবং আপনি সেট হয়ে গেছেন!
অবিভিষদ

নাহ। আমার পক্ষে কাজ করেনি। উভয়ই অন্য কোনও সমাধান করেনি।
অ্যান্ড্রয়েডদেভ

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. আপনি যদি 2121+ এপিটি লক্ষ্য করে থাকেন

android:backgroundসঙ্গে প্রতিস্থাপনandroid:backgroundTint

<!-- snackbar style in res/values-21/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:backgroundTint">@color/mySnackbarBackgroundColor</item>
</style>
  1. আপনি এপিআই <21 লক্ষ্য করে তারপর যদি আপনি এপিআই <21 জন্য উত্তরাধিকার snackbar ব্যবহার করার সিদ্ধান্ত নেন তাহলে আপনার abouve স্থির করতে পারে MySnackbarStyleমধ্যে মাঝামাঝি / মান -21 / ফোল্ডার এবং পূর্ববর্তী ছেড়ে - উত্তরাধিকার - আপনার মধ্যে শৈলী মাঝামাঝি / মান ফোল্ডার।

  2. আপনি যদি এপিআই <21 কে টার্গেট করছেন এবং আপনি যদি এই নিম্ন API স্তরেও স্নাকবারের উপাদানের স্টাইলটি রাখতে চান তবে আপনি নিজের স্ন্যাকবার শৈলীটি আপনার রেজোল / মান / এইভাবে পরিবর্তন করতে পারেন :

<!-- 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>

এখানে একটি খেলার মাঠ রেপো

এখানে চিত্র বর্ণনা লিখুন


4
এটিই সবচেয়ে পরিষ্কার এবং সর্বোত্তম সমাধান
ট্র্যাকড্যাভ

এটি স্নাকবারের আকার পরিবর্তন করেছে
উইলিয়াম

নোট করুন যে আপনার অ্যাপ থিমটি অবশ্যই থিম.মোটেরিয়াল কম্পোনেন্টগুলি থেকে সংকলনের জন্য উত্তরাধিকারসূত্রে পাওয়া যাবে
এ.ম্যামোড

জন্য ধন্যবাদ my_snackbar_background। এটি ছাড়াই স্নাকবার গোলাকার কোণগুলির সাথে আঁকা।
কুলমাইন্ড

আমি স্ট্যাকওভারফ্লো . com/ a/ 62006413/2914140 এ আরও কিছু স্টাইলিং যুক্ত করেছি ।
কুলমাইন্ড

17

কোটলিন সংস্করণ (একটি এক্সটেনশন সহ ):

একটি এক্সটেনশান (উদাহরণস্বরূপ স্নাকবারএক্সটেনশন.কটি জন্য) একটি ফাইল তৈরি করুন:

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

এর পরে, আপনার ক্রিয়াকলাপ / খণ্ডে আপনি এটি করতে সক্ষম হবেন:

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

সত্যই এই উত্তরটির মতো, আমি পাঠ্য রঙটিও যুক্ত করেছি: মজাদার স্নাকবার.উইথ কালার (@ কালারআইট ব্যাকগ্রাউন্ড কালার: ইন্ট, @ কালার ইন্টি টেক্সট কালার: ইন্ট): স্নাকবার {এই.ভিউ.সেটব্যাকগ্রাউন্ড কালার (ব্যাকগ্রাউন্ড কালার) এই.ভিউ.ফাইন্ডভিউবিআইআইডি <টেক্সটভিউ> android.support.design.R.id.snackbar_text) .setTextColor (পাঠ্য রঙ) এই ফেরত দিন will
উইলকডব্লু

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 অ্যান্ড্রয়েড প্রকল্পে কাজ করতে পেলাম।

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

জামারিনের জন্য +1 এর View snckView = snackbarview.View;পরিবর্তে snackbar.getView();এটি উপলভ্য নয় তবে ParseColorকাজ করছে না।
Cfun

@ সিফুন আপনি কি আপনার সমস্যাটিকে আরও কিছুটা ব্যাখ্যা করতে পারেন, যাতে আমি এটির সাথে আপনাকে সহায়তা করতে পারি।
সত্যজিৎ রঞ্জান

আমার খারাপ আমি System.Drawing.Color.ParseColorপরিবর্তে ব্যবহার করেছি Android.Graphics.Color.ParseColor। এখন আমার আছে: "'gettring' নামটি বর্তমান প্রসঙ্গে নেই"
Cfun

@ সিফুন আপনি কি কোনও ক্রিয়াকলাপ বা কোনও খণ্ডে এই ত্রুটিটি পেয়ে যাচ্ছেন বা আপনি অন্য কোনও ক্লাসে গেটস্ট্রিং () কল করছেন?
সত্যজিৎ রঞ্জান

আমি এটি অন্য কোনও ক্লাসে ডাকছি।
সিফুন

3

আমি একটি সামান্য ব্যবহারের ক্লাস তৈরি করেছি যাতে আমি সহজেই অ্যাপ্লিকেশনটির মাধ্যমে কাস্টম রঙিন স্নাকবারগুলি তৈরি করতে পারি।

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

3

সঙ্গে Snackbarঅন্তর্ভুক্ত উপাদান উপাদান লাইব্রেরী (com.google.android.material.snackbar.Snackbar ) শুধু ব্যবহার setBackgroundTintপদ্ধতি।

    Snackbar snackbar = Snackbar.make(view, "Snackbar custom style", Snackbar.LENGTH_LONG);
    snackbar.setBackgroundTint(ContextCompat.getColor(this,R.color.secondaryColor));
    snackbar.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

অন্য কোনও সমাধান আমার পক্ষে সত্যিই কাজ করে নি। যদি আমি কেবল স্নাকবারের পটভূমির রঙ সেট করে থাকি তবে টেক্সটভিউ এবং বোতামের নীচে লেআউটটি ডিফল্ট রঙে ছিল। যদি আমি টেক্সটভিউয়ের ব্যাকগ্রাউন্ড সেট করি তবে স্নাকবার দেখানোর পরে এটি কিছুটা জ্বলজ্বলে করে। এবং বোতামের চারপাশে লেআউটটি এখনও ডিফল্ট রঙে ছিল।

শেষে আমি জানতে পেরেছিলাম যে আমার পক্ষে সর্বোত্তম উপায় হ'ল টেক্সটভিউয়ের পিতামাতার (স্নেকবারকন্টেন্টলয়আউট) পটভূমির রঙ পরিবর্তন করা। এখন পুরো স্নাকবারটি সঠিকভাবে রঙিন হয়ে গেছে এবং এটি প্রদর্শিত হয়ে গেলে এটি জ্বলজ্বল করে না।

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

আমি জানি না কেন সেটব্যাকগ্রাউন্ড কালার () আমার প্রকল্পে খুঁজে পায় নি। এজন্য আমি একটি এক্সটেনশন ফাংশন তৈরি করেছি এবং এখন এটি ঠিক আছে।

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.