কীভাবে স্নাকবারের বিন্যাসটি কাস্টমাইজ করবেন?


95

কোনও স্ন্যাকবারের বিন্যাসকে কাস্টম ভিউতে পরিবর্তন করার কোনও পদ্ধতি আছে?

এখন এটি কালো আসে এবং আমরা পটভূমির রঙ পরিবর্তন করতে পারি। তবে আমি নতুন লেআউটটি স্ফীত করে এটিকে স্নাকবার্সের পটভূমি হিসাবে তৈরি করার সঠিক উপায়টি জানি না?

ধন্যবাদ ...

উত্তর:


149

স্নাকবার আপনাকে একটি কাস্টম বিন্যাস সেট করতে দেয় না। তবে, প্রিমোজ 990 এর পরামর্শ অনুসারে আপনি স্নাকবারের ভিউ পেতে পারেন। গেটভিউ ফাংশনটি Snackbar.SnackbarLayout প্রদান করে, এটি একটি অনুভূমিক লিনিয়ারলআউট আইটেম যার সন্তানরা একটি পাঠ্যদর্শন এবং একটি বোতাম। স্ন্যাকবারে আপনার নিজস্ব ভিউ যুক্ত করতে, আপনাকে কেবলমাত্র টেক্সটভিউটি লুকিয়ে রাখতে হবে এবং স্নাকবারে আপনার ভিউ যুক্ত করতে হবে nস্নকবারলয়আউট।

// Create the Snackbar
Snackbar snackbar = Snackbar.make(containerLayout, "", Snackbar.LENGTH_LONG);
// Get the Snackbar's layout view
Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) snackbar.getView();
// Hide the text
TextView textView = (TextView) layout.findViewById(android.support.design.R.id.snackbar_text);
textView.setVisibility(View.INVISIBLE);

// Inflate our custom view
View snackView = mInflater.inflate(R.layout.my_snackbar, null);
// Configure the view
ImageView imageView = (ImageView) snackView.findViewById(R.id.image);
imageView.setImageBitmap(image);
TextView textViewTop = (TextView) snackView.findViewById(R.id.text);
textViewTop.setText(text);
textViewTop.setTextColor(Color.WHITE);

//If the view is not covering the whole snackbar layout, add this line
layout.setPadding(0,0,0,0);

// Add the view to the Snackbar's layout
layout.addView(snackView, 0);
// Show the Snackbar
snackbar.show();

4
হাই..এটি আমার পক্ষে কাজ করে ... তবে আমার স্নাকবারের প্রস্থ পুরোপুরি প্রসারিত হয়নি
এইচ রাভাল

13
আমি এই ধরণের জিনিস দিয়ে সাবধানতা সতর্ক করব। আপনি কখনই জানেন না যে কখন এবং কখন এই সিস্টেম ক্লাসগুলির অভ্যন্তরীণ বাস্তবায়নের বিশদ পরিবর্তন হবে। এটি যদি আপনার যা প্রয়োজন তা না করে তবে নিজের কাস্টম উপাদানটি প্রয়োগ করা নিরাপদ।
ডিন ওয়াইল্ড

আমি আপনাকে ক্রাউটন লাইব্রেরি ব্যবহার করার পরামর্শ দেব
X09

@ ওজুফ ওয়েল ক্রাউটনের গ্রন্থাগারটি অবহিত করা হয়েছে
slinden77

4
V 25.1.0 এ শুরু করা এটি সম্ভব হয়ে ওঠে। নীচে আমার পোস্ট চেক করুন। সুন্দর উত্তরের জন্য ধন্যবাদ!
ইয়াকিভ মস্কান

65

এটি Android সাপোর্ট লাইব্রেরির 25.1.0 সংশোধন থেকে শুরু করা সম্ভব

I. আপনার মান / লেআউট ফোল্ডারে কাস্টম বিন্যাস ঘোষণা করুন।

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="horizontal"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

<Button
    android:id="@+id/snackbar_action"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="@dimen/design_snackbar_extra_spacing_horizontal"              
    android:layout_marginStart="@dimen/design_snackbar_extra_spacing_horizontal"
    android:layout_gravity="center_vertical|right|end"
    android:paddingTop="@dimen/design_snackbar_padding_vertical"
    android:paddingBottom="@dimen/design_snackbar_padding_vertical"
    android:paddingLeft="@dimen/design_snackbar_padding_horizontal"
    android:paddingRight="@dimen/design_snackbar_padding_horizontal"
    android:visibility="gone"
    android:textColor="?attr/colorAccent"
    style="?attr/borderlessButtonStyle"/>

<TextView
    android:gravity="center_vertical|right"
    android:id="@+id/snackbar_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:paddingTop="@dimen/design_snackbar_padding_vertical"
    android:paddingBottom="@dimen/design_snackbar_padding_vertical"
    android:paddingLeft="@dimen/design_snackbar_padding_horizontal"
    android:paddingRight="@dimen/design_snackbar_padding_horizontal"
    android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
    android:maxLines="@integer/design_snackbar_text_max_lines"
    android:layout_gravity="center_vertical|left|start"
    android:ellipsize="end"/>

</LinearLayout>

ইঙ্গিত:

  • @dimen/design_snackbarউপাদান নকশা নির্দেশিকা মেলে মান ব্যবহার করুন ।
  • ?attr/colorAccentআপনার অ্যাপ্লিকেশন থিম পরিবর্তনগুলি স্নাকবারে প্রয়োগ করতে ব্যবহার করুন ।

II। বেসট্রান্সিয়েন্টবটমবার ক্লাস প্রসারিত করুন ।

public class final CustomSnackbar extends BaseTransientBottomBar<CustomSnackbar> {

/**
 * Constructor for the transient bottom bar.
 *
 * @param parent The parent for this transient bottom bar.
 * @param content The content view for this transient bottom bar.
 * @param contentViewCallback The content view callback for this transient bottom bar.
 */
private CustomSnackbar(ViewGroup parent, View content,    
            ContentViewCallback contentViewCallback) {
    super(parent, content, contentViewCallback);
}
}

III। বেসট্রান্সিয়েন্টবটমবার.সন্টেন্টভিউক্যালব্যাক যোগ করুন

public class final CustomSnackbar ...{

...

private static class ContentViewCallback implements        
                   BaseTransientBottomBar.ContentViewCallback {

  // view inflated from custom layout
  private View content;

  public ContentViewCallback(View content) {
      this.content = content;
  }

  @Override
  public void animateContentIn(int delay, int duration) {
      // add custom *in animations for your views
      // e.g. original snackbar uses alpha animation, from 0 to 1
      ViewCompat.setScaleY(content, 0f);
      ViewCompat.animate(content)
                .scaleY(1f).setDuration(duration)
                .setStartDelay(delay);
  }

  @Override
  public void animateContentOut(int delay, int duration) {
      // add custom *out animations for your views
      // e.g. original snackbar uses alpha animation, from 1 to 0
      ViewCompat.setScaleY(content, 1f);
      ViewCompat.animate(content)
                .scaleY(0f)
                .setDuration(duration)
                .setStartDelay(delay);
  }
}
}

চতুর্থ। কাস্টম লেআউট এবং এটি পূরণের পদ্ধতি সহ স্নাকবার তৈরি করার পদ্ধতি যুক্ত করুন।

public class final CustomSnackbar ...{

...

public static CustomSnackbar make(ViewGroup parent, @Duration int duration) {
 // inflate custom layout
 LayoutInflater inflater = LayoutInflater.from(parent.getContext());
 View content = inflater.inflate(R.layout.snackbar_view, parent, false);

 // create snackbar with custom view
 ContentViewCallback callback= new ContentViewCallback(content);
 CustomSnackbar customSnackbar = new CustomSnackbar(parent, content, callback);
// Remove black background padding on left and right
customSnackbar.getView().setPadding(0, 0, 0, 0);


 // set snackbar duration
 customSnackbar.setDuration(duration);
 return customSnackbar;
 }

 // set text in custom layout
 public CustomSnackbar setText(CharSequence text) {
 TextView textView = (TextView) getView().findViewById(R.id.snackbar_text);
 textView.setText(text);
 return this;
 }

 // set action in custom layout
 public CustomSnackbar setAction(CharSequence text, final OnClickListener  listener) {
 Button actionView = (Button) getView().findViewById(R.id.snackbar_action);
 actionView.setText(text);
 actionView.setVisibility(View.VISIBLE);
 actionView.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
         listener.onClick(view);
         // Now dismiss the Snackbar
         dismiss();
     }
 });
 return this;
}
}

ভি। উদাহরণ CustomSnackbarএবং কল show()পদ্ধতি তৈরি করুন ।

CustomSnackbar customSnackbar = CustomSnackbar.make(rooView,      CustomSnackbar.LENGTH_INDEFINITE);
customSnackbar.setText("No network connection!");
customSnackbar.setAction("Retry", new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // handle click here
    }
});
customSnackbar.show();

স্নাকবার এবং এর কাস্টমাইজেশন সম্পর্কে মেটেরিয়ালডটকম এ আরও দেখুন

সম্পূর্ণ CustomSnackbar.classকোড:

import android.support.annotation.NonNull;
import android.support.design.widget.BaseTransientBottomBar;
import android.support.v4.view.ViewCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;


public class CustomSnackbar extends BaseTransientBottomBar<CustomSnackbar> {

    /**
     * Constructor for the transient bottom bar.
     *
     * @param parent The parent for this transient bottom bar.
     * @param content The content view for this transient bottom bar.
     * @param callback The content view callback for this transient bottom bar.
     */
    private CustomSnackbar(ViewGroup parent, View content, ContentViewCallback callback) {
        super(parent, content, callback);
    }

    public static CustomSnackbar make(@NonNull ViewGroup parent, @Duration int duration) {
        final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        final View content = inflater.inflate(R.layout.snackbar_view, parent, false);
        final ContentViewCallback viewCallback = new ContentViewCallback(content);
        final CustomSnackbar customSnackbar = new CustomSnackbar(parent, content, viewCallback);

        customSnackbar.getView().setPadding(0, 0, 0, 0);
        customSnackbar.setDuration(duration);
        return customSnackbar;
    }

    public CustomSnackbar setText(CharSequence text) {
        TextView textView = (TextView) getView().findViewById(R.id.snackbar_text);
        textView.setText(text);
        return this;
    }

    public CustomSnackbar setAction(CharSequence text, final View.OnClickListener listener) {
        Button actionView = (Button) getView().findViewById(R.id.snackbar_action);
        actionView.setText(text);
        actionView.setVisibility(View.VISIBLE);
        actionView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                listener.onClick(view);
                // Now dismiss the Snackbar
                dismiss();
            }
        });
        return this;
    }

    private static class ContentViewCallback implements BaseTransientBottomBar.ContentViewCallback {

        private View content;

        public ContentViewCallback(View content) {
            this.content = content;
        }

        @Override
        public void animateContentIn(int delay, int duration) {
            ViewCompat.setScaleY(content, 0f);
            ViewCompat.animate(content).scaleY(1f).setDuration(duration).setStartDelay(delay);
        }

        @Override
        public void animateContentOut(int delay, int duration) {
            ViewCompat.setScaleY(content, 1f);
            ViewCompat.animate(content).scaleY(0f).setDuration(duration).setStartDelay(delay);
        }
    }
}

4
@ আমিরজিয়ারাটি হ্যাঁ, এবং এর উপাদানগুলি অদলবদল করা হয়েছে (ডিফল্ট ক্রিয়া বোতামটি ডানদিকে রয়েছে)।
ইয়াকিভ মস্কান

4
আমি বাম এবং ডানদিকে মার্জিন পাচ্ছি তাই কালো পটভূমি দৃশ্যমান। কীভাবে এটি সরানো যায়?
লিও ড্রয়েডকোডার 21

4
@ আমিরজিয়ারাটি নীচে থেকে এটি দেখানোর জন্য আপনাকে স্নাকবার ক্লাস থেকে একটি প্রাইভেট স্ট্যাটিক পদ্ধতি অনুলিপি করতে হবে। আমি প্রশ্নের উত্তরে পদ্ধতিটি হাইলাইট করেছি।
টুনজি_ডি

4
আমি কীভাবে স্বচ্ছ পটভূমি সেট করব?
ড্যানিলোডিকিউইরোজ

4
@ ইয়াকিওমোস্পান আমার জন্য এটি নীচ থেকে দেখানো হচ্ছে, আপনি কি দয়া করে আমাকে বলতে পারেন আমি কীভাবে উপরে থেকে এটি প্রদর্শন করতে পারি?
লেভন পেট্রোসায়ান

24

এক্সএমএল উপায়:

এর জন্য ব্যবহৃত মূল লেআউট এক্সএমএল ফাইল Snackbarহ'ল এই ফাইলটি:

design_layout_snackbar_include.xml:

<?xml version="1.0" encoding="utf-8"?>        
<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
            android:id="@+id/snackbar_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
              ...
            android:ellipsize="end"/>

    <Button
            android:id="@+id/snackbar_action"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
              ...
            android:textColor="?attr/colorAccent"
            style="?attr/borderlessButtonStyle"/>

</merge>

সুতরাং এই লেআউটটিকে ওভাররাইড করার জন্য আপনার নিজের লেআউটটি নিজের android:idমতো করে একই লেখনটি লিখতে হবে এবং আপনার refs.xmlফাইলে আপনার এই লাইনটি যুক্ত করা উচিত:

<resources xmlns:tools="http://schemas.android.com/tools">
   ....   
    <item name="design_layout_snackbar_include" tools:override="true" type="layout">
        @layout/my_layout_snackbar
    </item>
   ....
</resources>

4
এটি আমার জন্য আগে ভাল কাজ করেছে তবে 25.1.0 ডিজাইন সমর্থন লাইব্রেরিতে আপডেট করার পরে আমি একীভূত বিন্যাসের ব্যতিক্রম পেতে শুরু করেছি। আমি এই কোডটি পেয়েছি যা আমাকে মার্জ ট্যাগটিকে একটি দর্শন হিসাবে পরিবর্তন করেছে এবং এটি এখন আবার কাজ করে।
নীলসি

4
এটি প্রস্থ প্রসারিত করে না। ধিক্কার এই অ্যান্ড্রয়েড !!!! কেন ভিউ পরিবর্তন করা অবশ্যই বেদনাদায়ক হতে হবে। ধুর! ছাই !!
আমির জিয়ারতী

উপাদান দস্তাবেজগুলি স্ট্যাকওভারফ্লো.comBaseTransientBottomBar / a
সীমানা

18

উত্তরটি হ'ল: স্নাকবারটি কাস্টমাইজ করবেন না। এতে একটি সংক্ষিপ্ত পাঠ্য এবং একটি ক্রিয়া ছাড়া আর কোনও উপাদান থাকা উচিত নয়। দেখুন গুগল মেটারিয়াল ডিজাইন নির্দেশিকা

আপডেট: আপনি যদি যাইহোক স্নাকবারটি এখানে কাস্টমাইজ করতে চান তবে আমি আমার অ্যাপ্লিকেশনটিতে প্রয়োগ করেছি:

//generate the snackbar
Snackbar sb = Snackbar.make(rootView, snack.text, duration);
//set te action button text color
sb.setActionTextColor(mCurrentActivity.getResources().getColor(R.color.snack_text_action));
//Get the view of the snackbar
View sbView = sb.getView();
//set background color
sbView.setBackgroundColor(mCurrentActivity.getResources().getColor(backgroudResId));
//Get the textview of the snackbar text
TextView textView = (TextView) sbView.findViewById(android.support.design.R.id.snackbar_text);
//set text color
textView.setTextColor(mCurrentActivity.getResources().getColor(R.color.snack_text));
//increase max lines of text in snackbar. default is 2.
textView.setMaxLines(10);

আমি কখনও চেষ্টা করিনি, তবে স্নাকবারের মূল দৃষ্টিভঙ্গিটি পাওয়ার সাথে সাথে আপনি স্নাকবারে প্রোগ্রামিয়ালি নতুন মতামত যুক্ত করতে পারেন।


17

কোড লিখিত জন্য চিত্র

private Snackbar showSnackbar(CoordinatorLayout coordinatorLayout, int duration) { // Create the Snackbar
    Snackbar snackbar = Snackbar.make(coordinatorLayout, "", duration);
    // 15 is margin from all the sides for snackbar
    int marginFromSides = 15;

    float height = 100;

    //inflate view
    View snackView = getLayoutInflater().inflate(R.layout.snackbar_layout, null);

    // White background
    snackbar.getView().setBackgroundColor(Color.WHITE);
    // for rounded edges
    snackbar.getView().setBackground(getResources().getDrawable(R.drawable.round_edges));

    Snackbar.SnackbarLayout snackBarView = (Snackbar.SnackbarLayout) snackbar.getView();
    FrameLayout.LayoutParams parentParams = (FrameLayout.LayoutParams) snackBarView.getLayoutParams();
    parentParams.setMargins(marginFromSides, 0, marginFromSides, marginFromSides);
    parentParams.height = (int) height;
    parentParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
    snackBarView.setLayoutParams(parentParams);

    snackBarView.addView(snackView, 0);
    return snackbar;
}

ক্রিয়াকলাপের অনক্রিটে:

CoordinatorLayout coordinatorLayout = findViewById(R.id.coordinator_layout);

final Snackbar snackbar = showSnackbar(coordinatorLayout, Snackbar.LENGTH_LONG);
            snackbar.show();
            View view = snackbar.getView();
            TextView tv = (TextView) view.findViewById(R.id.snackbar_action);
            tv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    snackbar.dismiss();
                }
            });

14

আমি এটি চেষ্টা করেছিলাম এবং এটি কাজ করে!

View custom = LayoutInflater.from(this).inflate(R.layout.custom_view, null);
snackbar.getView().setPadding(0,0,0,0);
((ViewGroup) snackbar.getView()).removeAllViews();
((ViewGroup) snackbar.getView()).addView(custom);
TextView textView = custom.findViewById(R.id.text);
View button = custom.findViewById(R.id.button);
textView.setText("Your text here");
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       // do something
    }
});

3

নিম্নলিখিত কোড ব্যবহার করে দেখুন।

Snackbar snackbar = Snackbar.make(container, "No Internet Connection", Snackbar.LENGTH_LONG);
View sbView = snackbar.getView();
sbView.setBackgroundColor(ContextCompat.getColor(this, R.color.colorPrimary));
snackbar.show();

বিঃদ্রঃ:

ধারক - বিন্যাসের পিতামাতার দর্শন।


1

ইয়াকিভ মস্পানের উত্তরে যুক্ত করতে BaseTransientBottomBar, নীচের দিক থেকে নিজের পছন্দ মতো শোয়ের মতো করে তৈরি করার জন্য, নির্ধারকের পক্ষে উপযুক্ত পিতামাতার সন্ধানের জন্য Snackbarএই পদ্ধতিটি Snackbarক্লাস থেকে অনুলিপি করুন BaseTransientBottomBar

private static ViewGroup findSuitableParent(View view) {
    ViewGroup fallback = null;
    do {
        if (view instanceof CoordinatorLayout) {
            // We've found a CoordinatorLayout, use it
            return (ViewGroup) view;
        } else if (view instanceof FrameLayout) {
            if (view.getId() == android.R.id.content) {
                // If we've hit the decor content view, then we didn't find a CoL in the
                // hierarchy, so use it.
                return (ViewGroup) view;
            } else {
                // It's not the content view but we'll use it as our fallback
                fallback = (ViewGroup) view;
            }
        }

        if (view != null) {
            // Else, we will loop and crawl up the view hierarchy and try to find a parent
            final ViewParent parent = view.getParent();
            view = parent instanceof View ? (View) parent : null;
        }
    } while (view != null);

    // If we reach here then we didn't find a CoL or a suitable content view so we'll fallback
    return fallback;
}

1

গৃহীত উত্তরের জন্য কোটলিন সংস্করণ: https://stackoverflow.com/a/33441214/2437655

 private fun showSnackbar() {
        val snackbar = Snackbar.make(
                binding.root,
                "",
                Snackbar.LENGTH_INDEFINITE
        )
        (snackbar.view as Snackbar.SnackbarLayout).apply {
            findViewById<View>(R.id.snackbar_text).visibility = View.INVISIBLE
            findViewById<View>(R.id.snackbar_action).visibility = View.INVISIBLE
            val snackbarBinding = DataBindingUtil.inflate<SnackbarBinding>(
                    LayoutInflater.from(this@SnackbarActivity),
                    R.layout.snackbar,
                    binding.root as ViewGroup,
                    false
            )
            setPadding(0, 0, 0, 0)
            addView(snackbarBinding.root, 0)
        }
        snackbar.setDuration(8000).show()
    }

1

কোটলিনের জন্য এখানে আমার ব্যবহার ক্লাসকোড: https://gist.github.com/Ryszardenko/db429bc7d177e646ffe27e0672a0958c#file-customsnackbar-kt

class CustomSnackbar(private val view: View) {

    fun showSnackBar(title: String, cancelFun: () -> Unit = {}) {
        val snackView = View.inflate(view.context, R.layout.snackbar, null)
        val binding = SnackbarBinding.bind(snackView)
        val snackbar = Snackbar.make(view, "", Snackbar.LENGTH_LONG)
        (snackbar.view as ViewGroup).removeAllViews()
        (snackbar.view as ViewGroup).addView(binding.root)
        snackbar.view.setPadding(0, 0, 0, 0)
        snackbar.view.elevation = 0f
        snackbar.setBackgroundTint(
            ContextCompat.getColor(
                view.context,
                android.R.color.transparent
            )
        )
        binding.tvTitle.text = title
        binding.btnCancel.setOnClickListener {
            cancelFun()
            snackbar.dismiss()
        }
        snackbar.show()
    }
}

বাতিলফান () একটি ল্যাম্বডা, ডিফল্টরূপে খালি - আপনি উদাহরণস্বরূপ "পূর্বাবস্থায় ফাংশন" করতে পারেন pass


0

আপনি এই লাইব্রেরি চেষ্টা করতে পারেন। এটি অ্যান্ড্রয়েড ডিফল্ট স্নাকবারের জন্য একটি মোড়ক। https://github.com/ChathuraHettiarachchi/CSnackBar

Snackbar.with(this,null)
    .type(Type.SUCCESS)
    .message("Profile updated successfully!")
    .duration(Duration.SHORT)
    .show();

অথবা আপনি নিজের মতামত ব্যবহার করতে পারেন,

View view = getLayoutInflater().inflate(R.layout.custom_view, null);

Snackbar.with(this,null)
        .type(Type.UPDATE)
        .contentView(view, 76)
        .duration(Duration.SHORT)
        .show();

বর্তমানে কেবলমাত্র কাস্টম বিন্যাসের সাথে ইস্যুটি হ'ল, আমাদেরকে ইনপুট হিসাবে ভিউ উচ্চতা পাস করতে হবে


আপনার লাইব্রেরিটি ব্যবহার করে কোনও ডিভাইসে কাস্টম পূর্ণ প্রস্থের স্নাকবার পাওয়া সম্ভব?
ইওরালাইফ

@ ইউরালাইফ বর্তমানে এটি অ্যান্ড্রয়েড স্নাকবারের জন্য একটি মোড়ক, তাই পারে না। কেবল মোবাইল ফোনে এটি পুরো প্রস্থ পাবে, ট্যাবলেটগুলিতে এটি প্রস্থ পূরণ করবে না
চথুরা জয়নাথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.