[Học Android] Cách hiển thị một dialog duy nhất trong Android
![[Học Android] Cách hiển thị một dialog duy nhất trong Android](https://webnulled.net/wp-content/uploads/2022/02/android-cach-hien-thi-mot-dialog-duy-nhat-trong-android_6202b1bb27208.png)
Khi lập trình Android, chúng ta thường dùng dialog để show lỗi gọi api, nếu màn hình của bạn có nhiều fragment và các fragment này đồng thời gọi các api khác nhau và bị lỗi thì hiển nhiên bạn chỉ muốn app show lên một dialog thôi. Trong bài viết này mình sẽ giới thiệu cách mà mình hiển thị duy nhất một dialog trong Android.
Mở đầu
Một ví dụ điển hình là bạn dùng Viewpager để gọi api. Nếu xảy ra lỗi thì các page bên cạnh đã được load sẵn và cũng sẽ show dialog lỗi gây ra việc duplicate và làm phiền ng dùng.
Vậy chúng ta có cách nào để xử lý việc này cho tiện không, có nhiều cách có thể làm và mình xin giới thiệu một cách để các bạn cùng tham khảo nhé.
Phát triển
Hướng xử lý của mình là:
-
Tạo biến lưu reference của showing dialog hiện tại.
-
Mỗi khi tạo dialog cần check có dialog nào đang đc show ko để dismiss nó đi và show dialog mới.
-
Khi fragment bị destroy thì cần huỷ dialog show bởi context của fragment đó và gán lại biến showing dialog thành null
var showingDialog: Dialog? = null
fun Context?.showDialog(
title: String? = null, message: String? = null,
textPositive: String? = null, positiveListener: (() -> Unit)? = null,
textNegative: String? = null, negativeListener: (() -> Unit)? = null,
cancelable: Boolean = false, canceledOnTouchOutside: Boolean = true
): AlertDialog? {
val context = this ?: return null
return MaterialAlertDialogBuilder(context).apply {
setTitle(title)
setMessage(message)
setPositiveButton(textPositive) { dialog, which ->
positiveListener?.invoke()
}
setNegativeButton(textNegative) { dialog, which ->
negativeListener?.invoke()
}
setCancelable(cancelable)
}.create().apply {
setCanceledOnTouchOutside(canceledOnTouchOutside)
// dismiss other showing dialog
if (showingDialog?.isShowing == true) {
showingDialog?.dismiss()
}
// listen onDestroy event and dismiss
if (context is LifecycleOwner) {
context.lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
[email protected]()
if (showingDialog === [email protected]) {
showingDialog = null
}
}
})
}
showingDialog = this
show()
}
}
Cùng với hướng xử lý như vậy các bạn có thể áp dụng cho các loại dialog khác
Bài lần này xin hết tại đây, hẹn gặp lại các bạn trong các bài tiếp theo.
Chào thân ái và quyết thắng!
Theo viblo.asia