[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

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

admin

Leave a Reply

Your email address will not be published. Required fields are marked *