نمایش دیالوگ ها با 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";
}

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

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

دیالوگ فرگمنت را نشان دهید

برای نمایش 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 ، می توانید از overload show() استفاده کنید که FragmentTransaction موجود را می پذیرد.

چرخه عمر DialogFragment

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

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

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

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

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

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

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

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

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