نمایش کادرهای گفتگو با DialogFragment

DialogFragment یک زیرکلاس قطعه ویژه است که برای ایجاد و میزبانی کادرهای گفتگو طراحی شده است. اگرچه لازم نیست کادر گفتگوی خود را در یک قطعه میزبانی کنید، اما انجام این کار به FragmentManager اجازه می‌دهد تا وضعیت کادر گفتگو را مدیریت کند و به‌طور خودکار کادر گفتگو را هنگام تغییر پیکربندی بازیابی کند.

ایجاد DialogFragment

برای ایجاد DialogFragment، کلاسی ایجاد کنید که DialogFragment را گسترش دهد و onCreateDialog() را لغو کند، همان‌طور که در مثال زیر نشان داده شده است.

کاتلین

class PurchaseConfirmationDialogFragment : DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =
            AlertDialog.Builder(requireContext())
                .setMessage(getString(R.string.order_confirmation))
                .setPositiveButton(getString(R.string.ok)) { _,_ -> }
                .create()

    companion object {
        const val TAG = "PurchaseConfirmationDialog"
    }
}

جاوا

public class PurchaseConfirmationDialogFragment extends DialogFragment {
   @NonNull
   @Override
   public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
       return new AlertDialog.Builder(requireContext())
               .setMessage(getString(R.string.order_confirmation))
               .setPositiveButton(getString(R.string.ok), (dialog, which) -> {} )
               .create();
   }

   public static String TAG = "PurchaseConfirmationDialog";
}

مشابه نحوه ایجاد ریشه View در قطعه معمولی توسط onCreateView()، onCreateDialog() یک Dialog برای نمایش به‌عنوان بخشی از DialogFragment ایجاد می‌کند. DialogFragment نمایش Dialog را در حالت‌های مناسب در چرخه حیات قطعه مدیریت می‌کند.

همانند onCreateView()، می‌توانید هر زیرکلاس Dialog را از onCreateDialog() برگردانید و محدود به استفاده از AlertDialog نیستید.

نمایش DialogFragment

برای نمایش DialogFragment خود، نیازی نیست که به‌صورت دستی FragmentTransaction ایجاد کنید. به‌جای آن، از روش show() برای نمایش کادر گفتگوی خود استفاده کنید. می‌توانید مرجعی را به FragmentManager و String ارسال کنید تا به‌عنوان برچسب FragmentTransaction استفاده شود.

هنگام ایجاد DialogFragment از داخل Fragment، از FragmentManager فرزند قطعه استفاده کنید تا وضعیت به‌درستی پس‌از تغییرات پیکربندی بازیابی شود. برچسب غیرتهی به شما امکان می‌دهد از findFragmentByTag() برای بازیابی DialogFragment در زمانی دیگر استفاده کنید.

کاتلین

// From another Fragment or Activity where you wish to show this
// PurchaseConfirmationDialogFragment.
PurchaseConfirmationDialogFragment().show(
     childFragmentManager, PurchaseConfirmationDialog.TAG)

جاوا

// From another Fragment or Activity where you wish to show this
// PurchaseConfirmationDialogFragment.
new PurchaseConfirmationDialogFragment().show(
       getChildFragmentManager(), PurchaseConfirmationDialog.TAG);

برای کنترل بیشتر بر FragmentTransaction، می‌توانید از show() overload که FragmentTransaction موجود را می‌پذیرد استفاده کنید.

چرخه حیات DialogFragment

DialogFragment از چرخه حیات قطعه استاندارد پیروی می‌کند، با چند فراخوانی چرخه حیات اضافی. رایج‌ترین آن‌ها به شرح زیر است:

  • onCreateDialog(): این callback را لغو کنید تا Dialog را برای مدیریت و نمایش قطعه ارائه دهید.
  • onDismiss(): اگر لازم است هنگام بسته شدن Dialog منطق سفارشی اجرا کنید، این فراخوانی برگشتی را لغو کنید، مثلاً منابع را منتشر کنید یا اشتراک منابع قابل‌مشاهده را لغو کنید.
  • onCancel(): اگر لازم است هنگام لغو شدن Dialog منطق سفارشی‌ای اجرا کنید، این فراخوان برگشتی را لغو کنید.

DialogFragment همچنین حاوی روش‌هایی برای بستن یا تنظیم قابلیت لغو DialogFragment شما است:

  • dismiss(): بستن قطعه و کادر گفتگوی آن. اگر قطعه به پشته قبلی‌ها اضافه شده باشد، همه وضعیت‌های پشته قبلی‌ها تا این ورودی و شامل آن، حذف می‌شوند. درغیراین‌صورت، تراکنش جدیدی برای برداشتن قطعه انجام می‌شود.
  • setCancelable(): کنترل می‌کند که آیا Dialog نشان‌داده‌شده قابل‌لغو است یا نه. از این روش به‌جای تماس مستقیم با Dialog.setCancelable(boolean) استفاده کنید.

هنگام استفاده از DialogFragment با Dialog، onCreateView() یا onViewCreated() را لغو نمی‌کنید. کادرهای گفتگو فقط نما نیستند—پنجره خودشان را دارند. بنابراین، برای لغو کردن onCreateView() کافی نیست. علاوه‌براین، onViewCreated() هرگز در DialogFragment سفارشی فراخوانی نمی‌شود، مگراینکه onCreateView() را لغو کرده باشید و نمای غیرتهی ارائه کرده باشید.

استفاده از نماهای سفارشی

می‌توانید با لغو کردن onCreateView()، DialogFragment ایجاد کنید و کادر گفتگویی را نمایش دهید. می‌توانید به آن layoutId بدهید، مانند یک قطعه معمولی، یا از DialogFragment سازنده استفاده کنید.

View برگردانده‌شده توسط onCreateView() به‌طور خودکار به کادر گفتگو اضافه می‌شود. در بیشتر موارد، این یعنی نیازی نیست onCreateDialog() را لغو کنید، چون کادر گفتگوی خالی پیش‌فرض با نمای شما پر می‌شود.

برخی‌از زیرکلاس‌های DialogFragment، مثل BottomSheetDialogFragment، نمای شما را در کادر گفتگویی جاسازی می‌کنند که به‌صورت برگه پایین طراحی شده است.