কীভাবে ডায়ালগফ্রেগমেন্টটি সঠিকভাবে বরখাস্ত করবেন?


121

দস্তাবেজগুলি ক্লাস dismiss()থেকে পদ্ধতিটির জন্য এটি বলে Dialog:

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

আমার কোডে, আমি যা করি তা হ'ল getDialog().dismiss()এটি খারিজ করার জন্য। তবে আমি অন্য কিছু করছি না এমনকি ব্যবহার করছি না onStop()। সুতরাং আমি ঠিক কীভাবে DialogFragmentকোনও মেমরি ফাঁস ইত্যাদি এড়ানোর জন্য একটিকে সঠিকভাবে খারিজ করতে বলছি asking

উত্তর:


197

tl; dr: বন্ধ করার সঠিক উপায় হ'ল ডায়ালগফ্রেগমেন্টে সরাসরিDialogFragment ব্যবহার ।dismiss()


বিশদ : ডায়ালগফ্র্যাগমেন্ট রাজ্যের ডকুমেন্টেশন

কথোপকথনের নিয়ন্ত্রণ (কখন এটি প্রদর্শন করবেন, লুকিয়ে রাখবেন, বরখাস্ত করবেন তা সিদ্ধান্ত নেবেন) ডায়ালগটিতে সরাসরি কল দিয়ে নয়, এখানে এপিআইয়ের মাধ্যমে করা উচিত।

সুতরাং, আপনার ব্যবহার করা উচিত নয় getDialog().dismiss(), যেহেতু dismiss() এটি ডায়ালগটিতে অনুরোধ করবে । পরিবর্তে, আপনাকে dismiss()ডায়ালগফ্রেগমেন্টের পদ্ধতিটি নিজেই ব্যবহার করা উচিত :

সর্বজনীন শূন্য বরখাস্ত ()

খণ্ড এবং এর কথোপকথনটি খারিজ করুন। যদি খণ্ডটি পিছনের স্ট্যাকটিতে যুক্ত করা হয় তবে সমস্ত এ্যাক স্ট্রাকাল স্ট্যাক স্টেট এবং এই এন্ট্রি সহ পপ করা হবে। অন্যথায়, খণ্ডটি সরানোর জন্য একটি নতুন লেনদেন প্রতিশ্রুতিবদ্ধ হবে।

আপনি দেখতে পাচ্ছেন, এটি কেবল কথোপকথনটি বন্ধ করার ক্ষেত্রেই নয়, প্রক্রিয়াতে জড়িত খণ্ডের লেনদেন পরিচালনা করারও যত্ন নেয়।

আপনার কেবলমাত্র onStopযদি ব্যবহারের দরকার হয় তবে আপনি যদি স্পষ্টভাবে এমন কোনও সংস্থান তৈরি করেন যার জন্য ম্যানুয়াল ক্লিনআপের প্রয়োজন হয় (ফাইলগুলি বন্ধ করা, কার্সার বন্ধ করা ইত্যাদি)। তারপরেও আমি অন্তর্নিহিত ডায়ালগের onStopচেয়ে ডায়ালগফ্র্যাগমেন্টকে ওভাররাইড করব onStop


1
@ স্কুটারনোভা: এটি করা উচিত নয়, আপনার সম্ভবত অন্য কোথাও একটি বাগ রয়েছে। আপনি কিভাবে খণ্ড তৈরি করছেন?
হেইনজি

protected void showDialogFragment(final DialogFragment fragment) {final FragmentTransaction fTransaction = getSupportFragmentManager().beginTransaction(); fTransaction.addToBackStack(null); fragment.show(fTransaction, "dialog");} দুষ্ট ওয়ান লাইনারের জন্য দুঃখিত! তবে হ্যাঁ আপনি ঠিক থাকতে পারেন, তাই আপাতত আমি আমার ডায়ালগফ্র্যাগমেন্টগুলি বন্ধ করার জন্য আরও একটি উপায় লিখেছি। বরখাস্ত () পদ্ধতিটি ব্যবহার করে আমি যেভাবে তাদের বরখাস্ত করছি তা কেবল ট্যাগ দ্বারা খণ্ডটি খুঁজে পেয়েছিল এবং তারপরে এটি বাতিল () বাতিল করে যদি এটি বাতিল না হয়। ওহ এবং হ্যাঁ, আমি newসেই পদ্ধতিটিতে পাস করার আগে খণ্ডটি ঠিকঠাক করে দিচ্ছি ।
চার্লস মাডেরে

2
@ স্কুটারনোভা: হুম, এতে কোনও ভুল দেখবেন না - অন্যদিকে, আমি কখনই সামঞ্জস্যের লাইব্রেরি ব্যবহার করি নি, তাই আমি এ সম্পর্কে নিশ্চিত হতে পারি না। হতে পারে এটি একটি ন্যূনতম, স্ব-অন্তর্ভুক্ত উদাহরণ তৈরি করা এবং এটিতে একটি নতুন প্রশ্ন শুরু করা বুদ্ধিমান হতে পারে।
হেইনজি

@ চার্লসমেডের এই দিনগুলিতে, আপনি কি কোনও সমাধান খুঁজে পেয়েছেন?
জ্যাকার্লোসআর

দুঃখিত @ জ্যাকার্লোস, এটি বছর আগে ছিল, আমি অনিশ্চিত।
চার্লস মাদেরে

76

আমি মনে করি একটি বন্ধ করার আরও ভাল উপায় DialogFragmentহ'ল:

Fragment prev = getSupportFragmentManager().findFragmentByTag("fragment_dialog");
if (prev != null) {
    DialogFragment df = (DialogFragment) prev;
    df.dismiss();
}

এইভাবে আপনাকে কোনও রেফারেন্স রাখতে হবে না DialogFragmentএবং এটিকে যে কোনও জায়গা থেকে বন্ধ করতে পারেন।


7

আপনি কেবল এই কোডটি ব্যবহার করার চেষ্টা করছেন না কেন:

dismiss();

আপনি যদি ডায়ালগ টুকরাটিকে নিজস্বভাবে খারিজ করতে চান। আপনি ডায়লগ খণ্ডন করতে চাইলে ডায়ালগ খণ্ডের ভিতরে আপনি কেবল এই কোডটি রাখতে পারেন।

উদাহরণ স্বরূপ:

button.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       dismiss();
   }
});

এটি স্ক্রিনে প্রদর্শিত সাম্প্রতিক ডায়ালগ টুকরোটি বন্ধ করবে।

আশা করি এটি আপনার জন্য সহায়ক হবে।



5

আমি টেরেলের উত্তরে একটি উত্সাহ দিলাম। আমি কেবল কোনও কোটলিন ব্যবহারকারীদের জন্য এটি পোস্ট করতে চেয়েছিলাম:

supportFragmentManager.findFragmentByTag(TAG_DIALOG)?.let {
    (it as DialogFragment).dismiss()
}

সাধারণ কোড কঠোর পরিশ্রম করে, আপডেট বন্ধুকে ধন্যবাদ !!
আয়ুশ কটুওয়াল

4

টেরেল উত্তর কোটলিন সংস্করণ

(fragmentManager.findFragmentByTag(TAG) as? DialogFragment)?.dismiss()

1

আপনি বরখাস্ত করা উচিত Dialogমধ্যে onPause()তাই এটি অগ্রাহ্য করে।

বরখাস্ত করার আগে আপনি যাচাই করতে পারেন nullএবং নীচের স্নিপেটের মতো দেখাচ্ছে:

@Override
protected void onPause() {
    super.onPause();
    if (dialog != null && dialog.isShowing()) {
        dialog.dismiss();
    }
}

তিনি ইতিমধ্যে লিখেছেন যে তিনি ডায়ালগফ্রেগমেন্ট সম্পর্কে বরখাস্ত () এবং করছেন।
পরেশ মায়ানী

আমি মনে করি এটি পরেশমায়ানী
ভেনকি

2
আমি বিশ্বাস করি @ পরেশমায়ানী সঠিক ভেঙ্কি। DialogFragmentগুগল দ্বারা দেওয়া টিউটোরিয়ালটি onPause()পদ্ধতিটি মোটেও ব্যবহৃত হচ্ছে তা দেখায় না । তবে আমি মনে করি আপনি যা করছেন আমি তা দেখতে পাচ্ছি। ব্যবহারকারী যদি ফোন না করে তবে কী কথা onPause()। সিস্টেম যখন জানবে তখন খণ্ডটিকে দূরে বলা হচ্ছে। কোন ব্যবহারকারী কখন বাতিল করে দেয় তা সম্পর্কে। সেক্ষেত্রে এটি বন্ধ করার সর্বোত্তম উপায় আর কী?
অ্যান্ডি

1

অন্যান্য উত্তরে অফিসিয়াল ডক্সের ( ডায়ালগফ্রেগমেন্ট রেফারেন্স ) রেফারেন্স রয়েছে তবে সেখানে প্রদত্ত উদাহরণের উল্লেখ নেই:

void showDialog() {
    mStackLevel++;

    // DialogFragment.show() will take care of adding the fragment
    // in a transaction.  We also want to remove any currently showing
    // dialog, so make our own transaction and take care of that here.
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    Fragment prev = getFragmentManager().findFragmentByTag("dialog");
    if (prev != null) {
        ft.remove(prev);
    }
    ft.addToBackStack(null);

    // Create and show the dialog.
    DialogFragment newFragment = MyDialogFragment.newInstance(mStackLevel);
    newFragment.show(ft, "dialog");
}

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

আমার প্রয়োজনের জন্য আমি এটিকে পরিবর্তন করেছি:

FragmentManager manager = getSupportFragmentManager();
Fragment prev = manager.findFragmentByTag(TAG);
if (prev != null) {
    manager.beginTransaction().remove(prev).commit();
}

MyDialogFragment fragment = new MyDialogFragment();
fragment.show(manager, TAG);

1

অন্যান্য উত্তরে যুক্ত করা, যখন DialogFragmentপুরো স্ক্রীন কলিং থাকে dismiss()তখন ডায়ালগফ্রেগমেন্টটি খণ্ডের ব্যাকস্ট্যাক থেকে পপ করে না। একটি কাজের onBackPressed()ভিত্তি হল পিতামাতার ক্রিয়াকলাপে কল করা।

এটার মতো কিছু:

CustomDialogFragment.kt

closeButton.onClick {
    requireActivity().onBackPressed()
}

দিনটি সংরক্ষণ করুন, অনেক অনেক ধন্যবাদ
মাহমুদ হেরেটানি

0

আপনি যে খণ্ডটি খারিজ করতে চান তা থেকে কেবল বরখাস্ত () কল করুন।

imageView3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            dismiss();
        }
    });

0

আমি দেখতে পেলাম যে যখন আমার খণ্ডটি কোনও <fragment>ট্যাগের সাথে নেভিগেশন গ্রাফে সংজ্ঞায়িত করা হয়েছিল (সম্পূর্ণ পর্দার কথোপকথনের জন্য), তখন ডায়ালগফ্র্যাগমেন্টটি dismiss()কমান্ড দিয়ে বরখাস্ত করবে না । পরিবর্তে, আমাকে পিছনের স্ট্যাকটি পপ করতে হয়েছিল:

findNavController(getActivity(), R.id.nav_host_fragment).popBackStack();

যাইহোক, যদি একই ডায়ালগফ্র্যাগমেন্টটি কোনও <dialog>ট্যাগ সহ নেভিগেশন গ্রাফে সংজ্ঞায়িত করা হয় তবে তা dismiss()ঠিক কাজ করে।


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