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
، نمای شما را در یک گفتگو قرار میدهند که به عنوان یک صفحه پایین استایلبندی شده است.