ডায়ালগফ্রেগমেন্টের প্রস্থ এবং উচ্চতা কীভাবে সেট করবেন?


173

আমি আমার ডায়ালগফ্রেগমেন্টের লেআউটটি একটি এক্সএমএল লেআউট ফাইলে (আসুন এটি কল করি layout_mydialogfragment.xml) এবং এর বৈশিষ্ট্যগুলি layout_widthএবং layout_heightবিশেষত ( 100dpপ্রতিটি বলা যাক) উল্লেখ করি। আমি তারপরে আমার ডায়ালগফ্রেগমেন্টের onCreateView(...)পদ্ধতিতে এই লেআউটটি ফুলিয়েছি :

View view = inflater.inflate(R.layout.layout_mydialogfragment, container, false);

দুর্ভাগ্যবশত, আমি যে যখন আমার কথোপকথন (DialogFragment) প্রদর্শিত হবে, এটা সম্মান করে না layout_widthএবং layout_heightতার XML বিন্যাস ফাইলের মধ্যে উল্লিখিত (এবং আমার ডায়ালগ পর্যন্ত সঙ্কুচিত বা অসম বিষয়বস্তু উপর নির্ভর করে বিস্তৃতি)। এর এক্সএমএল লেআউট ফাইলে নির্দিষ্ট হওয়া layout_widthএবং আমি কীভাবে আমার ডায়লগটি সম্মান করতে পারি তা কীভাবে জানেন layout_height? এই মুহুর্তে আমার ডায়ালগফ্রেগমেন্টের onResume()পদ্ধতিতে আমার ডায়ালগটির প্রস্থ এবং উচ্চতাটি আবার উল্লেখ করতে হচ্ছে ...

getDialog().getWindow().setLayout(width, height);

... এবং এইভাবে, অনস্বীকার্যভাবে, ডায়ালগের প্রস্থ এবং উচ্চতায় দুটি জায়গায় ভবিষ্যতের যে কোনও পরিবর্তন করতে হবে তা মনে রাখতে হবে।


2
জ্যাম্পকোস্টার উত্তর গ্রহণ করার বিষয়টি বিবেচনা করুন। এটি কোনও হ্যাক নয় এবং এটি আসলে সমস্যাটি সমাধান করে।
বোগদান জুড়াক

উত্তর:


168

আপনি যদি রিসোর্সের মান থেকে সরাসরি রূপান্তর করেন:

int width = getResources().getDimensionPixelSize(R.dimen.popup_width);
int height = getResources().getDimensionPixelSize(R.dimen.popup_height);        
getDialog().getWindow().setLayout(width, height);

তারপরে কথোপকথনের জন্য আপনার লেআউটে ম্যাচ_প্যারেন্টটি নির্দিষ্ট করুন:

android:layout_width="match_parent"
android:layout_height="match_parent"

আপনাকে কেবলমাত্র একটি জায়গা সম্পর্কে চিন্তা করতে হবে (এটি নিজের জায়গায় রাখুন DialogFragment#onResume)। এটি নিখুঁত নয়, তবে কমপক্ষে এটি আপনার ডায়ালগের বিন্যাসের ফাইলের মূল হিসাবে একটি সম্পর্কিত ayালাইআউট থাকার জন্য কাজ করে।


3
এই উত্তরটি আমার ক্ষেত্রে কার্যকর হয় না (ডায়ালগফ্র্যাগমেন্টের জন্য)। উইন্ডো প্রদর্শনের আকার পরিবর্তনের জন্য আমাকে ফ্রেগমেন্টলআউট প্যারামগুলি ব্যবহার করতে হয়েছিল।
রুশফেরুথ

3
আমাকে আমার লেআউটটি মোড়াতে হয়েছিল RelativeLayoutএবং এটি আমাকে সহায়তা করেছিল। সমাধানের জন্য অনেক ধন্যবাদ - এটি আমার অনেক সময় সাশ্রয় করেছে।
জনি দো

62
এটি আমার জন্য দুর্দান্ত কাজ করে (অ্যান্ড্রয়েড 4.0.০+), একবার যখন বুঝতে পারলাম এটি অবশ্যই থাকা উচিত onResume(), না onCreateView()। (আমার মূল বিন্যাসটি স্ক্রোলভিউতে আবৃত রিলেটিভলআউট))
জোনিক

14
কিছু ক্ষেত্রে কার্যকর: পুরো পর্দার প্রস্থ ব্যবহার করুন:int width = getResources().getDisplayMetrics().widthPixels
জোনিক

6
জোনিকের জন্য +1। রিচার্ডের জন্য -1। আমি সর্বদা সহায়তার টুকরোগুলি ব্যবহার করি এবং এটি কখনই কাজ করতে সক্ষম হইনি onCreateDialog()। ভিতরে থাকা দরকার onResume()
MinceMan

146

আমি Fragment.onResume()অন্তর্নিহিত ডায়ালগটি থেকে বৈশিষ্ট্যগুলিকে ওভাররাইড করে এবং ধরে ফেললাম , তারপরে সেখানে প্রস্থ / উচ্চতার প্যারামগুলি সেট করব। আমি বাহ্যতমতম বিন্যাসের উচ্চতা / প্রস্থকে সেট করেছি match_parent। নোট করুন যে এই কোডটি xML লেআউটেও আমি সংজ্ঞায়িত মার্জিনগুলিকে সম্মান করে বলে মনে হচ্ছে।

@Override
public void onResume() {
    super.onResume();
    ViewGroup.LayoutParams params = getDialog().getWindow().getAttributes();
    params.width = LayoutParams.MATCH_PARENT;
    params.height = LayoutParams.MATCH_PARENT;
    getDialog().getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);
}

2
ধন্যবাদ! এটা আমার জন্য কাজ করে ! তবু এটি এটি করার একটি মার্জিত উপায়।
এন্টোইনপি

1
@ জ্যামাকুলেট - তাত্ক্ষণিক প্রশ্ন: আপনি যখন কাস্টিং করছেন তখন আপনি (android.view.WindowManager.LayoutParams)এটিকে কাস্ট করছেন? LayoutParamsফাংশনের প্রথম 3 লাইনে উপস্থিত হওয়ার জন্য সঠিক আমদানিটি বেছে নেওয়ার সময় আমি বিস্মিত হয়েছিলাম । নির্বাচন শেষ (android.view.WindowManager.LayoutParams)। এটি কি সঠিক বলে মনে হচ্ছে?
দেব-আইএল

@ দেব-ইল getAttributes () একটি WindowManger.LayoutParams ফিরিয়ে দেওয়া উচিত তবে আমার ক্ষেত্রে আমি পরোক্ষভাবে ViewGroup.LayoutParams সামনে ছুঁড়ে কারণ যে সব আমি প্রয়োজন (কার্যকর জাভা, আইটেম 52) নেই - আমি এই প্রতিফলিত করার প্রশ্নটিকে সম্পাদনা করব
jmaculate

1
আপনার যদি এটিতে আবার কাস্ট করতে হয় তবে উপরের তিনটি লাইন android.view.WindowManager.LayoutParamsব্যবহার করা অকেজো ViewGroup.LayoutParams... আপনি এখানে কোনও নমনীয়তা অর্জন করবেন না। যাই হোক না কেন, এই উত্তরের জন্য আপনাকে ধন্যবাদ!
কেভিন রোবটেল

2
এটিই সেরা সমাধান। এমনকি আপনি MATCH_PARENT বা Wrap_CONTENT এর সাথে পিক্সেলের একটি নির্দিষ্ট মানও ব্যবহার করতে পারেন।
কোয়েশ

98

এক্সএমএল প্রধান বিন্যাসে (আমার ক্ষেত্রে লিনিয়ারলআউট) নিম্নলিখিত বিষয়গুলি সংজ্ঞায়িত করে আমি একটি স্থির আকারের ডায়ালগফ্রেগমেন্ট পেয়েছি:

android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="1000dp"
android:minHeight="450dp"

4
আমি দেখতে পেয়েছি যে হানিকম্বের মিডউইথ এবং মিনি হাইট দরকার - তবে আইসিএসে নয়।
daveywc

1
এটি প্রথম নজরে কাজ করে বলে মনে হচ্ছে তবে সম্ভবত এটি এড়ানো উচিত। ডিভাইসের প্রস্থের উপর নির্ভর করে দৃশ্যটি স্ক্রিনটি অবিরত থাকবে তাই আপনার নীচের ডান কোণায় বোতাম থাকলে সেগুলি প্রদর্শিত হবে না।
কোডি এঞ্জেল

দৃশ্যটি পর্দার বাইরে চলছে না। অ্যান্ড্রয়েড সিস্টেমটি নিশ্চিত করেছে যে ডায়ালগফ্রেগমেন্টটি নির্দিষ্ট সীমানা এবং মিনিট হাইটের চেয়ে ছোট হলেও সীমাবদ্ধ (ছোট ব্যবধানের সাথে) ভিউ সীমানার ভিতরে থাকবে।
লেন্সফ্লেয়ার

51

আমার ক্ষেত্রে কাজ করা একমাত্র জিনিসটি এখানে সমাধানের ইঙ্গিতটি দেখিয়েছিল: http://adilatwork.blogspot.mx/2012/11/android-dialogfraament-dialog-sizing.html

আদিল ব্লগ পোস্ট থেকে স্নিপেট:

@Override
public void onStart()
{
  super.onStart();

  // safety check
  if (getDialog() == null)
    return;

  int dialogWidth = ... // specify a value here
  int dialogHeight = ... // specify a value here

  getDialog().getWindow().setLayout(dialogWidth, dialogHeight);

  // ... other stuff you want to do in your onStart() method
}

নিখুঁত সমাধান এবং খুব ভাল ব্লগে ব্যাখ্যা করা হয়েছে।
বরুণ ভরদ্বাজ

getDialog().getWindow().setLayout(dialogWidth, dialogHeight); ডায়ালগফ্র্যাগমেন্টের জন্য +1 পুরোপুরি কাজ করে। তবে আমি সুরক্ষা চেক বুঝতে পারি না। আমাদের চেক করতে হবে কেন null?
tpk

3
@ ২৯৩৩ - কেবল কারণটির কোনও গ্যারান্টি নেই যে অনুরোধের সময় Dialog(কোনও সন্তানের DialogFragment) উপলব্ধ হবে। এটা সম্ভব যে আমরা যখন কল করি তখন অ্যান্ড্রয়েড নালাগুলি ফিরে আসবে getDialog()
rmirabelle

@ মীরাবলে যদি আপনি ডায়ালগটির অন স্টার্ট কলব্যাকটি দিয়ে থাকেন তবে কীভাবে ডায়ালগটি নাল হতে পারে?
রোমেক্স

49

আপনার DialogFragmentপ্রস্থ এবং উচ্চতা নিয়ন্ত্রণ করার একটি উপায় হ'ল এটির সংলাপটি আপনার দর্শনটির প্রস্থ এবং উচ্চতা সম্মান করে কিনা তা নিশ্চিত করা makeWRAP_CONTENT

ব্যবহার ThemeOverlay.AppCompat.Dialog

এটি অর্জনের একটি সহজ উপায় হ'ল ThemeOverlay.AppCompat.Dialogঅ্যান্ড্রয়েড সমর্থন লাইব্রেরিতে অন্তর্ভুক্ত স্টাইলটি ব্যবহার করা ।

DialogFragmentসাথে Dialog:

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View view = inflater.inflate(R.layout.dialog_view, null);

    Dialog dialog = new Dialog(getContext(), R.style.ThemeOverlay_AppCompat_Dialog);
    dialog.setContentView(view);
    return dialog;
}

DialogFragment সঙ্গে AlertDialog (সতর্কীকরণ: minHeight="48dp"):

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View view = inflater.inflate(R.layout.dialog_view, null);

    AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), R.style.ThemeOverlay_AppCompat_Dialog);
    builder.setView(view);
    return builder.create();
}

ThemeOverlay.AppCompat.Dialogআপনার ডায়লগগুলি তৈরি করার সময় আপনি নিজের অ্যাপ্লিকেশনটির এক্সএমএল থিমটিতে যুক্ত করে আপনি ডিফল্ট থিম হিসাবে সেট করতে পারেন ।
সাবধানতা অবলম্বন করুন, অনেকগুলি ডায়ালগের দেখতে ভাল লাগার জন্য ডিফল্ট ন্যূনতম প্রস্থের প্রয়োজন।

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- For Android Dialog. -->
    <item name="android:dialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>

    <!-- For Android AlertDialog. -->
    <item name="android:alertDialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>

    <!-- For AppCompat AlertDialog. -->
    <item name="alertDialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>

    <!-- Other attributes. -->
</style>

DialogFragment সঙ্গে Dialog , এর ব্যবহার করে android:dialogTheme:

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View view = inflater.inflate(R.layout.dialog_view, null);

    Dialog dialog = new Dialog(getContext());
    dialog.setContentView(view);
    return dialog;
}

DialogFragmentসঙ্গে AlertDialog, ব্যবহার android:alertDialogThemeবাalertDialogTheme (সতর্কতা minHeight="48dp":) ব্যবহার করে:

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View view = inflater.inflate(R.layout.dialog_view, null);

    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    builder.setView(view);
    return builder.create();
}

বোনাস

পুরানো অ্যান্ড্রয়েড এপিআইগুলিতে, Dialogতাদের শিরোনামের কারণে কিছু প্রস্থ সমস্যা রয়েছে বলে মনে হয় (এমনকি আপনি যদি সেট নাও করেন)।
আপনি যদি ব্যবহার করতে না চানThemeOverlay.AppCompat.Dialog শৈলী এবং আপনার Dialogকোনও শিরোনামের প্রয়োজন নেই (বা কাস্টম রয়েছে) তবে আপনি এটি অক্ষম করতে চাইতে পারেন:

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View view = inflater.inflate(R.layout.dialog_view, null);

    Dialog dialog = new Dialog(getContext());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(view);
    return dialog;
}

পুরানো উত্তর, বেশিরভাগ ক্ষেত্রে কাজ করবে না

আমি প্রোগ্রামটিমে কোনও নির্দিষ্ট আকার নির্দিষ্ট না করেই ডায়লগটি আমার বিন্যাসের প্রস্থ এবং উচ্চতার সম্মান করার চেষ্টা করছিলাম।

আমি এটি বুঝতে পেরেছিলাম android:windowMinWidthMinorএবং android:windowMinWidthMajorসমস্যা তৈরি করছিলাম । যদিও তারা আমার Activityবা থিমটিতে অন্তর্ভুক্ত ছিল না, তবুও সেগুলি Dialogথিমটিতে প্রয়োগ করা হচ্ছে Activity, কোনওভাবে h

আমি তিনটি সম্ভাব্য সমাধান নিয়ে এসেছি।

সমাধান 1: একটি কাস্টম সংলাপ থিম তৈরি করুন এবং ডায়ালগটি তৈরি করার সময় এটি ব্যবহার করুন DialogFragment

<style name="Theme.Material.Light.Dialog.NoMinWidth" parent="android:Theme.Material.Light.Dialog">
    <item name="android:windowMinWidthMinor">0dip</item>
    <item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new Dialog(getActivity(), R.style.Theme_Material_Light_Dialog_NoMinWidth);
}

সমাধান 2: একটি কাস্টম থিম তৈরি করতে ব্যবহার করুন যা সংলাপটির জন্য ContextThemeWrapperপরিবেশন করবে Context। আপনি যদি কোনও কাস্টম সংলাপ থিম তৈরি করতে না চান তবে এটি ব্যবহার করুন (উদাহরণস্বরূপ, আপনি যখন নির্দিষ্ট থিমটি ব্যবহার করতে চান android:dialogTheme)।

<style name="Theme.Window.NoMinWidth" parent="">
    <item name="android:windowMinWidthMinor">0dip</item>
    <item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new Dialog(new ContextThemeWrapper(getActivity(), R.style.Theme_Window_NoMinWidth), getTheme());
}

সমাধান 3 (একটি সঙ্গে AlertDialog): জোরদার android:windowMinWidthMinorএবং android:windowMinWidthMajorমধ্যে ContextThemeWrapperদ্বারা নির্মিত AlertDialog$Builder

<style name="Theme.Window.NoMinWidth" parent="">
    <item name="android:windowMinWidthMinor">0dip</item>
    <item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public final Dialog onCreateDialog(Bundle savedInstanceState) {
    View view = new View(); // Inflate your view here.
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setView(view);
    // Make sure the dialog width works as WRAP_CONTENT.
    builder.getContext().getTheme().applyStyle(R.style.Theme_Window_NoMinWidth, true);
    return builder.create();
}

4
আমি সত্যিই জানি না কেন এটি হ'ল এটি গৃহীত উত্তর নয়। এটি আক্ষরিকভাবে একমাত্র উত্তর যা কাজ করে এবং একটি হ্যাক নয় (আমি বেশিরভাগ ক্ষেত্রে আপনার 1 ম সমাধানের জন্য কথা বলছি)।
বোগদান জুড়াক

1
দুর্ভাগ্যক্রমে এটি পাওয়া গেল কীভাবে সমাধান করতে হবে তা বোঝার জন্য এক ঘন্টা ব্যয় করার পরে!
ব্রেইনভিশন

সমাধান 3 আমার জীবন বাঁচায়। আপনাকে অনেক ধন্যবাদ
সাইমন

আমি পুরানো অ্যান্ড্রয়েড এপিআইতে আপনার সমস্যাটি পুনরুত্পাদন করতে সক্ষম হয়েছি। এমন কিছু বিকল্প যুক্ত করেছে যা আপনাকে সাহায্য করতে পারে।
jpmcosta

সমাধান 1 আমার পক্ষে কাজ করেছিল। আমি সবেমাত্র Theme.MaterialComponents.Light.Dialogপিতামাতা হিসাবে ব্যবহার করেছি এবং এর নির্মাণকারীটিতে এই স্টাইলটি ব্যবহার করেছি MaterialAlertDialogBuilder। 1 ঘন্টা গবেষণা পরে আপনার উত্তর হোঁচট খাচ্ছে। ধন্যবাদ এবং থাম্বস আপ।
শাহুদ উল হাসান

39

গটচা # 13: DialogFragmentলেআউটগুলি

এটা মনের এক ধরণের সত্যিই অচল।

একটি তৈরি করার সময় DialogFragment, আপনি ওভাররাইড করতে বেছে নিতে পারেন onCreateView(যা ViewGroupআপনার .xml লেআউটটিকে সংযুক্ত করতে পাস করে) বা onCreateDialog, যা না করে।

আপনার অবশ্যই দুটি পদ্ধতি ওভাররাইড করা উচিত নয়, কারণ আপনি সম্ভবত অ্যান্ড্রয়েডকে বিভ্রান্ত করবেন যে আপনার ডায়ালগের বিন্যাসটি কখন ফুলে উঠেছে! ডব্লিউটিএফ?

আপনি কীভাবে ডায়ালগটি ব্যবহার করতে চান তা ওভাররাইড করতে হবে OnCreateDialogবা OnCreateViewনির্ভর করবে।

  • যদি আপনি কোনও উইন্ডোতে ডায়লগটি চালু করেন (স্বাভাবিক আচরণ), আপনি ওভাররাইড করবেন বলে আশা করা হচ্ছে OnCreateDialog
  • যদি আপনি কোনও বিদ্যমান ইউআই লেআউটের (ডাবল কম সাধারণ) ডায়ালগের অংশটিকে এম্বেড করার উদ্দেশ্যে থাকেন, তবে আপনি ওভাররাইডের প্রত্যাশা করছেন OnCreateView

এটি সম্ভবত বিশ্বের সবচেয়ে খারাপ জিনিস।

onCreateDialog বাতুলতা

সুতরাং, আপনি অগ্রাহ্য করছি onCreateDialogআপনার DialogFragmentএকটি কাস্টমাইজড উদাহরণস্বরূপ তৈরি করতে AlertDialogএকটি উইন্ডোতে প্রদর্শন। কুল। তবে মনে রাখবেন, onCreateDialogকোন পায় ViewGroup.xml বিন্যাস আপনার কাস্টম সংযুক্ত করতে করতে । কোনও সমস্যা নেই, আপনি কেবল এটিকে পাস nullকরুনinflate পদ্ধতিতে ।

পাগলামি শুরু.

আপনি যখন ওভাররাইড করেন onCreateDialog, অ্যান্ড্রয়েড সম্পূর্ণরূপে IGNORES .xml লেআউট এর মূল নোডের কয়েকটি বৈশিষ্ট্য যা আপনি স্ফীত করে। এর মধ্যে অন্তর্ভুক্ত রয়েছে তবে সম্ভবত এটি সীমাবদ্ধ নয়:

  • background_color
  • layout_gravity
  • layout_width
  • layout_height

এটি প্রায় হাস্যকর, কারণ আপনাকে প্রতিটি .xML লেআউট এবং অ্যান্ড্রয়েড স্টুডিও সেট করতে হবে layout_widthএবং layout_heightলজ্জার সুন্দর একটি লাল ব্যাজ দিয়ে আপনাকে চড় মারবে।

শুধু কথা DialogFragment আমাকে ছুঁকতে চায় makes আমি অ্যান্ড্রয়েড গটচস এবং স্নাফাসে ভরা একটি উপন্যাস লিখতে পারি, তবে এটি একটি অন্যতম অন্তর্নিহিত।

বিচক্ষণতায় ফিরে আসার জন্য, প্রথমে আমরা জাস্টটিকে পুনরুদ্ধার করার জন্য একটি স্টাইল ঘোষণা করি background_colorএবং layout_gravityআমরা প্রত্যাশা করি:

<style name="MyAlertDialog" parent="Theme.AppCompat.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:layout_gravity">center</item>
</style>

ডায়ালগগুলির জন্য বেস থিম থেকে উপরের শৈলীটি উত্তরাধিকার সূত্রে প্রাপ্ত ( AppCompatএই উদাহরণের থিমটিতে )।

এরপরে, আমরা অ্যান্ড্রয়েডকে কেবল একপাশে ফেলে দেওয়া মানগুলিকে পিছনে রাখতে এবং স্ট্যান্ডার্ড চেহারাটি এবং অনুভূতি পুনরুদ্ধার করতে আমরা স্টাইলটি প্রোগ্রামিকভাবে প্রয়োগAlertDialog করি:

public class MyDialog extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        View layout = getActivity().getLayoutInflater().inflate(R.layout.my_dialog_layout, null, false);
        assert layout != null;
        //build the alert dialog child of this fragment
        AlertDialog.Builder b = new AlertDialog.Builder(getActivity());
        //restore the background_color and layout_gravity that Android strips
        b.getContext().getTheme().applyStyle(R.style.MyAlertDialog, true);
        b.setView(layout);
        return b.create();
    }
}

উপরের কোডটি আপনার AlertDialogচেহারাটিকে AlertDialogআবার একটির মতো করে তুলবে । সম্ভবত এটি যথেষ্ট ভাল।

তবে অপেক্ষা করুন, আরও আছে!

আপনি যদি একটি বিশেষ সেট নির্ধারণ করতে চান layout_widthবা layout_heightআপনার জন্যAlertDialog যখন এটি প্রদর্শিত হয় (খুব সম্ভবত), তবে অনুমান করুন কী, আপনি এখনও করেননি!

আপনি যখন বুঝতে পারেন যে উদ্দীপনাটি এখনও অব্যাহত রয়েছে আপনি যদি কোনও নির্দিষ্ট layout_widthবা layout_heightআপনার অভিনব নতুন স্টাইলে সেট করার চেষ্টা করেন তবে অ্যান্ড্রয়েডও এটিকে পুরোপুরি উপেক্ষা করবে !:

<style name="MyAlertDialog" parent="Theme.AppCompat.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:layout_gravity">center</item>
    <!-- NOPE!!!!! --->
    <item name="android:layout_width">200dp</item>
    <!-- NOPE!!!!! --->
    <item name="android:layout_height">200dp</item>
</style>

একটি বিশেষ উইন্ডো প্রস্থ বা উচ্চতা সেট করতে, আপনি একটি সম্পূর্ণ 'পুষ্টি পদ্ধতিতে এগিয়ে যেতে এবং মোকাবেলা করতে হবে LayoutParams:

@Override
public void onResume() {
    super.onResume();
    Window window = getDialog().getWindow();
    if(window == null) return;
    WindowManager.LayoutParams params = window.getAttributes();
    params.width = 400;
    params.height = 400;
    window.setAttributes(params);
}

অনেক লোক অ্যান্ড্রয়েডের WindowManager.LayoutParamsআরও সাধারণ পর্যন্ত কাস্টিংয়ের খারাপ উদাহরণ অনুসরণ করে ViewGroup.LayoutParams, কেবল ডানদিকে ঘুরিয়ে দেওয়ার জন্য এবং পরে কয়েক লাইনে ViewGroup.LayoutParamsফিরে যেতে পারে WindowManager.LayoutParams। কার্যকর জাভা নিন্দিত হতে পারে, যে অযৌক্তিক ingালাই কোডটি বোঝার পক্ষে আরও কঠিন করে তোলা ছাড়া আর কিছুই দেয় না।

পার্শ্ব দ্রষ্টব্য: LayoutParamsঅ্যান্ড্রয়েড এসডিকে জুড়ে কয়েকটি TWENTY পুনরাবৃত্তি রয়েছে - মূলত দুর্বল ডিজাইনের একটি নিখুঁত উদাহরণ।

সংক্ষেপে

জন্য DialogFragmentযে ওভাররাইড গুলি onCreateDialog:

  • মানক AlertDialogচেহারা এবং অনুভূতি পুনরুদ্ধার করতে , এমন একটি শৈলী তৈরি করুন যা background_color= transparentএবং layout_gravity= সেট করে centerএবং সেই শৈলীতে প্রয়োগ করে onCreateDialog
  • একটি নির্দিষ্ট layout_widthএবং / অথবা সেট করতে layout_height, প্রোগ্রামযুক্তভাবে এটি onResumeদিয়ে করুনLayoutParams
  • বিচক্ষণতা বজায় রাখার জন্য, অ্যান্ড্রয়েড এসডিকে নিয়ে চিন্তা না করার চেষ্টা করুন।

13
এই উত্তরটি পড়ার ফলে আমি কাঁদতে চাইছি।
বেসিনেটর

3
ডুড, আপনি এখনই ঠিক যা অনুভব করছেন তা আপনি বর্ণনা করেছেন।
মের্ট গলসয়

2
অ্যান্ড্রয়েড বিষ্ঠা হয়। আমি আপনাকে ভাই অনুভব করি। সমস্ত কিছুর জন্য একটি প্রসঙ্গের প্রয়োজন, অ্যাপ্লিকেশন প্রক্রিয়াটি নিহত হয়, কিছু জিনিসের জন্য সমর্থন লাইব্রেরির অভাব রয়েছে, তালিকাটি চালিয়ে যায়
ডেনিসভিএ

1
@ আর্মিরাবেলে - এই উত্তরটি আসলে সহায়তা করে আপনি আসলে একটি মাঝারি ব্লগ লিখতে পারেন এবং অনেকের পক্ষে সহায়ক হতে পারেন। আমার ক্ষেত্রে আমি সীমাবদ্ধ বিন্যাস এবং ডায়ালগফ্রেগমেন্ট ব্যবহার করছি, সুতরাং অ্যান্ড্রয়েড 9 এ উপেক্ষা করা হয়েছিল, অ্যান্ড্রয়েড 9 এর নীচে এটি ঠিক কাজ করছে। আমি যোগ হয়েছে - "Android: windowMinWidthMajor," android: windowMinWidthMinor "শৈলী এবং এটা কাজ জরিমানা শুরু করে।
রাহুল


14

আমার যখন ডায়ালগফ্রেগমেন্টটি আরও প্রশস্ত করতে হবে তখন আমি মিনিউইথটি সেট করছি:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="320dp"
    ... />

1
আমার মতে সেরা সমাধান!
ফ্যাবিয়ান ক্যানাপ

আপনি যদি এটি সংকীর্ণ করতে চান?
ড্যানিয়েল

8

ওভাররাইড করতে আমি একটি বাধ্যকারী কারণ দেখি না onResumeবা onStartপ্রস্থ এবং উচ্চতা সেট করতে Windowমধ্যে DialogFragmentএরDialog - এই বিশেষ জীবনচক্র পদ্ধতি বারবার এবং অকারণে নামক পেতে পারেন চালানো যে বহু জানালা সুইচিং ভালো জিনিস কারণে কোড একাধিকবার মাপ, backgrounding তারপরে অ্যাপ্লিকেশনটিকে ফোরগ্রাউন্ডিং করা ইত্যাদি। সেই পুনরাবৃত্তির পরিণতিগুলি মোটামুটি তুচ্ছ, তবে কেন এটির জন্য নিষ্পত্তি?

ওভাররাইড onActivityCreated()পদ্ধতিতে পরিবর্তে প্রস্থ / উচ্চতা নির্ধারণ করা একটি উন্নতি হবে কারণ এই পদ্ধতিটি বাস্তবতার জন্য কেবলমাত্র একবারে আপনার উদাহরণ হিসাবে ডাকা হয় DialogFragment। উদাহরণ স্বরূপ:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Window window = getDialog().getWindow();
    assert window != null;

    WindowManager.LayoutParams layoutParams = window.getAttributes();
    layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
    window.setAttributes(layoutParams);
}

উপরে আমি প্রস্থটি match_parentডিভাইস অভিমুখী নির্বিশেষে নির্ধারণ করেছি । আপনি যদি চান যে আপনার ল্যান্ডস্কেপ ডায়ালগটি এত প্রশস্ত না হয় তবে আপনি getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAITআগে থেকে যাচাই করে নিতে পারেন।


6

বহিরাগততম বিন্যাসে মাত্রা ডায়ালগটিতে কাজ করে না। আপনি একটি লেআউট যুক্ত করতে পারেন যেখানে বাহ্যতমের নীচে মাত্রা নির্ধারণ করা যায়।

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<LinearLayout
    android:layout_width="xxdp"
    android:layout_height="xxdp"
    android:orientation="vertical">

</LinearLayout>


5

আমি এটিকে মূল উপাদান বিন্যাসের পরামিতিগুলি সেট করে ফিক্স করেছি।

int width = activity.getResources().getDisplayMetrics().widthPixels;
int height = activity.getResources().getDisplayMetrics().heightPixels;
content.setLayoutParams(new LinearLayout.LayoutParams(width, height));

5

এক্সএমএলে ডায়ালগফ্র্যাগমেন্ট প্রস্থ / উচ্চতা নির্ধারণ করার জন্য এখানে একটি উপায়। একটি স্বচ্ছ পটভূমি সহ আপনার ফ্রেমলেআউট (যে কোনও লেআউট কাজ করবে) এ কেবলমাত্র আপনার ভিউহিরার্কিটি মোড়ুন।

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

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/transparent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:background="@color/background_material_light">

      .....

আমি এটি চেষ্টা করে যাচ্ছি কারণ এটি যদি ধারাবাহিকভাবে কাজ করে তবে এক্সএমএল এর লেআউটের অংশ এবং কোডটির কিছু অংশ কোডিংয়ের ক্ষেত্রে এটি একটি বেস্ট উচ্চতর পদ্ধতি। ধন্যবাদ
rmirabelle

আমি এই পদ্ধতির ধারণাটি পছন্দ করি তবে পরীক্ষিত হয়ে গেলে এটি কেবল উচ্চতা এবং প্রস্থকে প্রোগ্রামগতভাবে পরিবর্তনের চেয়ে আলাদা লেআউট দেয়। উদাহরণস্বরূপ, সামগ্রিক প্রস্থটি একটি সতর্কতা ডায়ালগ দ্বারা সরবরাহিত সর্বাধিক প্রস্থকে জোর করে হ্রাস করা হয় (সম্ভবত অ্যান্ড্রয়েড স্টাইলগুলির কারণে)। আমি যখন কোডের মাধ্যমে কেবল ডাব্লু এবং এইচ সেট করি তখন সতর্কতা ডায়ালগ স্টাইলটি ওভাররুল করা হয়। এটি তবে অনেকগুলি প্রয়োজন মাপসই এবং এটি একটি সূক্ষ্ম ধারণা। ইতিহাসের সবচেয়ে খারাপ এসডিকে দীর্ঘজীবী করুন।
rmirabelle

অনক্রিটভিউয়ের জন্য দুর্দান্ত কাজ করেছেন, যতক্ষণ না আমি অভ্যন্তরের প্রস্থটিকে ম্যাচ_পিতাতে পরিবর্তন করতে চেয়েছি ...
টিউডর

5

এখানে কোটলিন সংস্করণ

    override fun onResume() {
        super.onResume()

        val params:ViewGroup.LayoutParams = dialog.window.attributes
        params.width = LinearLayout.LayoutParams.MATCH_PARENT
        params.height = LinearLayout.LayoutParams.MATCH_PARENT
        dialog.window.attributes = params as android.view.WindowManager.LayoutParams
    }

4

আপনি প্রস্থ জন্য শতাংশ ব্যবহার করতে পারেন।

<style name="Theme.Holo.Dialog.MinWidth">
<item name="android:windowMinWidthMajor">70%</item>

আমি এই উদাহরণের জন্য হলো থিম ব্যবহার করেছি।


3

আপনি জাভা থেকে লেআউটের প্রস্থ এবং উচ্চতা নির্ধারণ করতে কোডের নীচে করতে পারেন।

final AlertDialog alertDialog  = alertDialogBuilder.create();
final WindowManager.LayoutParams WMLP = alertDialog.getWindow().getAttributes();

WMLP.gravity = Gravity.TOP;
WMLP.y = mActionBarHeight;
WMLP.x = getResources().getDimensionPixelSize(R.dimen.unknown_image_width);

alertDialog.getWindow().setAttributes(WMLP);
alertDialog.show();

2

আমি অ্যালার্টডায়ালগ.বিল্ডার ব্যবহার করে ডায়ালগটি তৈরি করি যাতে আমি রডরিগোর উত্তরটি একটি অনশোলিস্টিনারের অভ্যন্তরে ব্যবহার করি।

dialog.setOnShowListener(new OnShowListener() {

            @Override
            public void onShow(DialogInterface dialogInterface) {
                Display display = getWindowManager().getDefaultDisplay();
                DisplayMetrics outMetrics = new DisplayMetrics ();
                display.getMetrics(outMetrics);
                dialog.getWindow().setLayout((int)(312 * outMetrics.density), (int)(436 * outMetrics.density));
            }

        });

(মূলত ভবিষ্যতের পাঠকদের জন্য :) স্ট্যাকওভারফ্লো . com/a/7979823/3372061 তেSnicolas " DialogFragmentবনাম AlertDialog" আলোচনার মাধ্যমে মন্তব্য দেখুন ।
দেব-আইএল

2

অ্যান্ড্রয়েড .0.০ এ কাজ করা একই সমস্যা নিয়ে চলেছে into কাস্টম ভিউ এর মূল মধ্যে প্রকৃত সেট নির্বিশেষে থিমের AlertDialogপূর্বনির্ধারিত widthসেটটিতে ডিফল্ট হবে । আমি এটি সঠিকভাবে সামঞ্জস্য সেট করতে পেতে সক্ষম ছিল এর । আরও তদন্ত না করে দেখে মনে হচ্ছে আসল উপাদানগুলির আকার নির্ধারণ করা এবং তাদের চারপাশে মূলের মোড়ক রাখা এটি প্রত্যাশার মতো কাজ করে। নীচে একটি লোডিং ডায়ালগের একটি এক্সএমএল লেআউট রয়েছে যা ডায়ালগটির সঠিকভাবে সেট করে । ব্যবহার এই লাইব্রেরি অ্যানিমেশন জন্য।widthLayoutwidthloading_message TextViewLayoutwidth

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/custom_color"
    android:padding="@dimen/custom_dimen">
    <com.github.rahatarmanahmed.cpv.CircularProgressView
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/progress_view"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_centerHorizontal="true"
        app:cpv_color="@color/white"
        app:cpv_animAutostart="true"
        app:cpv_indeterminate="true" />
    <TextView
        android:id="@+id/loading_message"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progress_view"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:textSize="18dp"
        android:layout_marginTop="@dimen/custom_dimen"
        android:textColor="@color/white"
        android:text="@string/custom_string"/>
</RelativeLayout>

2

সহজ এবং কঠিন:

@Override
    public void onResume() {
        // Sets the height and the width of the DialogFragment
        int width = ConstraintLayout.LayoutParams.MATCH_PARENT;
        int height = ConstraintLayout.LayoutParams.MATCH_PARENT;
        getDialog().getWindow().setLayout(width, height);

        super.onResume();
    }

2

আমার ক্ষেত্রে DialogFragmentসম্পূর্ণ ক্রিয়াকলাপের আকারের মতো FragmentDialogFragmentএক্সএমএল-বিন্যাস ওপর ভিত্তি করে, না AlertDialog। আমার ভুলটি ডায়ালগের খণ্ডটিকে FragmentManagerস্বাভাবিক খণ্ড হিসাবে যুক্ত করেছিল :

fragmentManager?.beginTransaction()?.run {
    replace(R.id.container, MyDialogFragment.newInstance(), MyDialogFragment.TAG)
    addToBackStack(MyDialogFragment.TAG)
}?.commitAllowingStateLoss()

পরিবর্তে আমার showডায়ালগ খণ্ডে প্রয়োজন:

val dialogFragment = MyDialogFragment.newInstance()
fragmentManager?.let { dialogFragment.show(it, MyDialogFragment.TAG) }

কিছু সম্পাদনার পরে (আমার ViewPager2লেআউটে রয়েছে) ডায়ালগ খণ্ডটি খুব সংকীর্ণ হয়ে উঠল:

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

আমি এন 1 এইচকের সমাধানটি ব্যবহার করেছি :

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    dialog?.window?.attributes?.width = ViewGroup.LayoutParams.MATCH_PARENT
}

এখন এটি প্রস্থ এবং উচ্চতার সংজ্ঞা দিয়েছে, সম্পূর্ণ ক্রিয়াকলাপের আকার নয়।

আমি onCreateViewএবং সম্পর্কে বলতে চাই onCreateDialog। আপনার যদি বিন্যাসের উপর ভিত্তি করে একটি ডায়ালগ খণ্ড থাকে তবে আপনি এই 2 টি পদ্ধতির যেকোনটি ব্যবহার করতে পারেন।

1) আপনি যদি ব্যবহার করেন onCreateViewতবে আপনার onActivityCreatedপ্রস্থ সেট করতে ব্যবহার করা উচিত ।

2) আপনি যদি এর onCreateDialogপরিবর্তে ব্যবহার করেন তবে আপনি onCreateViewসেখানে প্যারামিটার সেট করতে পারেন। onActivityCreatedপ্রয়োজন হবে না।

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    super.onCreateDialog(savedInstanceState)

    val view = activity?.layoutInflater?.inflate(R.layout.your_layout, null)

    val dialogBuilder = MaterialAlertDialogBuilder(context!!).apply { // Or AlertDialog.Builder(context!!).apply
        setView(view)
        // setCancelable(false)
    }

    view.text_view.text = "Some text"

    val dialog = dialogBuilder.create()
    // You can access dialog.window here, if needed.

    return dialog
}

আপনি আমার দিনটি বাঁচিয়েছেন, অনলাইনে কার্যকলাপের প্রশস্ততা আমার জন্য কাজ করেছেন।
হাজরা ম্যাগডি

@ মনিষকুমারশর্মা, শুভকামনা!
কুলমাইন্ড

1

আমার ক্ষেত্রে এটি এ এর align_parentBottom="true"অভ্যন্তরীণ ভিউতে দেওয়া হয়েছিল RelativeLayout। সমস্ত অ্যালাইনপিয়েন্টবটমগুলি সরানো হয়েছে এবং সমস্ত বিন্যাস উল্লম্ব লিনিয়ারলআউটগুলিতে পরিবর্তন হয়েছে এবং সমস্যাটি চলে গেছে।


1

RelativeLayout এ কাস্টম কথোপকথনের প্যারেন্ট লেআউট সেট করুন , স্বয়ংক্রিয়ভাবে সাধারণ প্রস্থ এবং উচ্চতা পান।

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

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

1

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

(নিশ্চিত হয়ে নিন যে আপনি তার সমাধানটি দেখেছেন) এটি ছিল তার সমাধান .. এখানে ক্লিক করুন দেখেছেন এটি ব্যতীত কাজ করেছে: builder.getContext ()। GetTheme ()। প্রয়োগশৈলী (আর.স্টাইল। থিম_ উইন্ডো_নোমিনউইথ, সত্য);

আমি এটা পরিবর্তন

 @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {


        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        // Get layout inflater
        LayoutInflater layoutInflater = getActivity().getLayoutInflater();

        // Set layout by setting view that is returned from inflating the XML layout
        builder.setView(layoutInflater.inflate(R.layout.dialog_window_layout, null));


        AlertDialog dialog = builder.create();

        dialog.getContext().setTheme(R.style.Theme_Window_NoMinWidth);

শেষ লাইনটি আসলে কী আলাদা।


0
@Override
public void onStart() {
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        dialog.getWindow().setLayout(-1, -2);
        dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
        Window window = getDialog().getWindow();
        WindowManager.LayoutParams params = window.getAttributes();
        params.dimAmount = 1.0f;
        window.setAttributes(params);
        window.setBackgroundDrawableResource(android.R.color.transparent);
    }
}

0

এটি সহজ সমাধান

আমি যে সর্বোত্তম সমাধানটি পেয়েছি তা হ'ল onCreateDialog()পরিবর্তে ওভাররাইড করা onCreateView()। সেটকন্টেন্টভিউ () স্ফীতকরণের আগে সঠিক উইন্ডো মাত্রা সেট করবে। এটি রিসোর্স ফাইলগুলিতে একটি মাত্রা, পটভূমির রঙ, স্টাইল ইত্যাদি সংরক্ষণ এবং সেট করে নিজেই সেট করার প্রয়োজনীয়তা সরিয়ে দেয়।

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new Dialog(getActivity());
    dialog.setContentView(R.layout.fragment_dialog);

    Button button = (Button) dialog.findViewById(R.id.dialog_button);
    // ...
    return dialog;
}

0

আপনার যুক্ত করুন FragmentDialog:

public void onResume() {
    Window window = getDialog().getWindow();
    Point size = new Point();
    Display display = window.getWindowManager().getDefaultDisplay();
    display.getSize(size);
    window.setLayout( (int)(size.x * 0.9), WindowManager.LayoutParams.WRAP_CONTENT );
    window.setGravity( Gravity.CENTER );
    super.onResume();
}

0

এটি পুরোপুরি কাজ করবে।

@Override
public void onResume() {
    super.onResume();
    Window window = getDialog().getWindow();
    if(window == null) return;
    WindowManager.LayoutParams params = window.getAttributes();
    params.width = 400;
    params.height = 400;
    window.setAttributes(params);
}

এটি 3+ বছর পূর্বে গৃহীত উত্তরগুলি যা বলেছিল তা অনেকটাই।
আদিল হুসেন

-4

প্রায় পুরো স্ক্রিকে কভার করে এমন একটি ডায়ালগ পেতে: প্রথমে স্ক্রিনপ্যারামিটার ক্লাসটি সংজ্ঞায়িত করুন

public class ScreenParameters
{
    public static int Width;
    public static  int Height;

    public ScreenParameters()
    {
        LayoutParams l = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
        Width= l.width;
        Height = l.height;
    }
}

তারপরে আপনার getDialog.getWindow ()। SetLayout () পদ্ধতির আগে আপনাকে স্ক্রিনপ্যারামেটর কল করতে হবে you

@Override
public void onResume()
{
    super.onResume();
    ScreenParameters s = new ScreenParameters();
    getDialog().getWindow().setLayout(s.Width , s.Height);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.