Modal Presentation dalam pengembangan mobile: apa itu, jenis layar

Penulis: IT Sectr Diterbitkan: 2026-06-09 Waktu membaca: 5 mnt

Modal Presentation — cara menampilkan layar di atas konteks saat ini dengan memblokir interaksi dengan antarmuka sebelumnya. Dalam pengembangan mobile, jendela modal digunakan untuk tugas fokus: input data, konfirmasi tindakan, otentikasi, dan pemilihan opsi. Menurut Apple HIG, 2025, presentasi modal tidak boleh lebih dari 20% skenario navigasi dalam aplikasi. Di Android, modalitas diimplementasikan melalui DialogFragment, BottomSheet, dan Activity dengan flag launch tertentu.

Poin utama

  • Modal Presentation — teknik tampilan layar yang memblokir interaksi dengan konten sebelumnya hingga jendela modal ditutup.
  • iOS menggunakan UIModalPresentationStyle dengan varian .fullScreen, .pageSheet, .formSheet, dan .automatic.
  • Android mengimplementasikan modalitas melalui DialogFragment, BottomSheetDialogFragment, dan Activity dengan flag Intent.
  • SwiftUI menyediakan modifier .sheet dan .fullScreenCover untuk presentasi modal deklaratif.
  • Jetpack Compose menggunakan Dialog dan ModalBottomSheet untuk membuat antarmuka modal.

Apa itu Modal Presentation?

Modal Presentation — adalah pola navigasi di mana layar baru muncul di atas layar saat ini, untuk sementara memblokir interaksi dengan konten induk. Pengguna harus secara eksplisit menyelesaikan tugas modal (batal, simpan, tutup) untuk kembali ke keadaan sebelumnya.

Modalitas memecahkan tugas kognitif: memfokuskan perhatian pengguna pada satu tindakan tanpa gangguan dari antarmuka lainnya. Ini sangat penting untuk formulir pendaftaran, dialog konfirmasi, pemilihan file, dan otentikasi melalui layanan pihak ketiga. Human Interface Guidelines Apple merekomendasikan penggunaan modalitas hanya untuk tugas yang memerlukan penyelesaian sebelum melanjutkan pekerjaan.

Tidak seperti jendela modal web, Modal Presentation mobile bisa layar penuh (mengambil seluruh layar) atau parsial (Page Sheet, Bottom Sheet). Pemilihan jenis tergantung pada konteks tugas dan konvensi platform. iOS cenderung menggunakan Page Sheet untuk sebagian besar skenario, meninggalkan Full Screen untuk pemutar video dan editor foto.

Push Presentation (navigasi tumpukan) menambahkan layar ke tumpukan navigasi dan secara otomatis menampilkan tombol kembali. Pengguna dapat kembali ke layar sebelumnya kapan saja. Modal Presentation, sebaliknya, memerlukan penyelesaian eksplisit: tombol kembali tidak ada atau menutup jendela modal, bukan kembali ke layar sebelumnya.

Perbedaan utama antara presentasi modal dan push: Modal Presentation memblokir navigasi mundur tanpa kehilangan data, memerlukan tindakan untuk menutup (Save, Cancel, Done) dan biasanya mewakili tugas terpisah. Push Presentation mempertahankan hierarki navigasi, secara otomatis menambahkan tombol kembali, dan cocok untuk melihat konten secara berurutan.

KarakteristikModal PresentationPush Presentation
Blokir mundurYa, memerlukan tindakan eksplisitTidak, tombol kembali selalu tersedia
Penggunaan tipikalFormulir, otentikasi, pemilihanLihat detail, navigasi
AnimasiDari bawah ke atas (iOS), geser (Android)Dari kanan ke kiri (iOS)
Tumpukan navigasiTidak ditambahkan ke tumpukan utamaDitambahkan ke tumpukan

Dalam praktiknya, pilihan antara Modal dan Push tergantung pada konteks. Disarankan menggunakan modalitas untuk tugas yang harus diselesaikan pengguna sebelum melanjutkan, dan Push untuk menjelajahi konten secara berurutan. Mencampur pola pada layar yang sama menyebabkan kebingungan dan memperburuk UX.

Presentasi modal di iOS: UIKit dan SwiftUI

iOS menawarkan beberapa gaya presentasi modal melalui enumerasi UIModalPresentationStyle. UIKit mendukung .fullScreen (layar penuh), .pageSheet (kartu dengan margin atas), .formSheet (jendela terpusat di iPad) dan .automatic (pemilihan oleh sistem berdasarkan konteks). Mulai iOS 13, gaya default menjadi .automatic, yang untuk iPhone memilih .pageSheet.

UIViewController.present

Metode dasar UIKit untuk presentasi modal — present(_:animated:completion:). Controller yang memanggil metode menjadi presentingViewController, dan yang baru menjadi presentedViewController. Penutupan dilakukan melalui dismiss(animated:completion:). SwiftUI menyediakan modifier .sheet untuk perilaku serupa.

SwiftUI .sheet

Pendekatan deklaratif SwiftUI menggunakan modifier .sheet dan .fullScreenCover. Yang pertama membuat Page Sheet, yang kedua — presentasi modal layar penuh. Keduanya menerima binding ke Bool atau objek yang dapat diidentifikasi yang mengontrol visibilitas jendela modal. Penutupan terjadi saat binding diatur ke false atau pemanggilan dismiss dari environment.

swift
struct ContentView: View {
    @State private var showModal = false

    var body: some View {
        Button("Buka formulir") {
            showModal = true
        }
        .sheet(isPresented: $showModal) {
            RegistrationForm()
        }
    }
}

struct RegistrationForm: View {
    @Environment(\.dismiss) private var dismiss

    var body: some View {
        Button("Simpan") { dismiss() }
    }
}

Presentasi modal di Android: Fragment dan Compose

Android tidak memiliki API tunggal untuk presentasi modal seperti iOS. Sebaliknya, platform menawarkan beberapa mekanisme: DialogFragment untuk jendela dialog, BottomSheetDialogFragment untuk panel bawah, dan Activity dengan flag NEW_TASK dan CLEAR_TOP untuk layar modal. Di Jetpack Compose, komponen tunggal Dialog telah muncul untuk semua jenis jendela modal.

DialogFragment

DialogFragment — kelas dasar untuk jendela modal di Android SDK. Ia mengelola siklus hidup dialog, memproses rotasi layar, dan menyimpan status. Fragment ditampilkan di atas Activity tanpa memblokir tumpukan navigasi. Penutupan dilakukan melalui dismiss() atau klik di luar area dialog jika setCancelable(true).

Modal Bottom Sheet

BottomSheetDialogFragment menampilkan jendela modal sebagai panel yang muncul dari bawah. Pola ini populer di Material Design untuk pemilihan opsi, berbagi, dan tindakan cepat. BottomSheet dapat memiliki tinggi tetap atau dapat diperluas (peek height + full height). Di Compose, digunakan ModalBottomSheet dari pustaka Material3.

kotlin
@Composable
fun ModalScreen(onDismiss: () -> Unit) {
    Dialog(onDismissRequest = onDismiss) {
        Card(
            modifier = Modifier.padding(16.dp)
        ) {
            Column {
                Text("Formulir modal", style = MaterialTheme.typography.headlineSmall)
                Button(onClick = onDismiss) {
                    Text("Tutup")
                }
            }
        }
    }
}

Praktik terbaik presentasi modal

Jendela modal — alat UX yang kuat, tetapi penggunaan berlebihan memperburuk pengalaman pengguna. Apple HIG dan Google Material Design sepakat dalam rekomendasi: modalitas harus diterapkan untuk tugas fokus dan tidak melebihi 20% dari total tindakan navigasi.

Kapan menggunakan presentasi modal

Jendela modal cocok untuk skenario: input data (formulir pendaftaran, profil), konfirmasi (penghapusan, pengiriman), pemilihan (pemilih tanggal, manajer file) dan otentikasi (OAuth, Firebase Auth). Jika tugas memakan waktu kurang dari 30 detik dan memerlukan pemblokiran konteks — pilih modalitas.

Apa yang harus dihindari

Jangan gunakan presentasi modal untuk: melihat konten secara berurutan (gunakan Push), menampilkan kesalahan (gunakan Toast atau Snackbar), iklan dan penawaran promosi tanpa permintaan eksplisit pengguna. Material Design merekomendasikan untuk menghindari jendela modal bersarang — ini membingungkan pengguna dan melanggar hierarki navigasi.

Untuk jendela modal dengan bidang teks, pastikan untuk menangani kehilangan fokus keyboard. Saat keyboard muncul, jendela modal harus bergerak ke atas sehingga pengguna dapat melihat teks yang dimasukkan. UIKeyboardWillShowNotification di iOS dan adjustResize di Android menyelesaikan masalah ini.

Contoh kode di Swift dan Kotlin

Mari kita lihat implementasi presentasi modal di kedua platform. Contoh Swift menunjukkan konfigurasi UIModalPresentationStyle.pageSheet dengan delegasi untuk menangani penutupan. Contoh Kotlin mendemonstrasikan DialogFragment dengan layout kustom dan penyimpanan status.

swift
let modalVC = ModalViewController()
modalVC.modalPresentationStyle = .pageSheet

if let sheet = modalVC.sheetPresentationController {
    sheet.detents = [.medium(), .large()]
    sheet.prefersGrabberVisible = true
}

modalVC.presentationController?.delegate = self
present(modalVC, animated: true)

// MARK: - UIAdaptivePresentationControllerDelegate
extension ViewController: UIAdaptivePresentationControllerDelegate {
    func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
        print("Jendela modal ditutup")
    }
}
kotlin
class ModalDialogFragment : DialogFragment() {
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_modal, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        view.findViewById<Button>(R.id.closeButton).setOnClickListener {
            dismiss()
        }
    }
}

Pertanyaan yang sering diajukan

Kapan sebaiknya menggunakan Modal Presentation daripada Push?

Gunakan Modal Presentation untuk tugas fokus yang harus diselesaikan pengguna sebelum melanjutkan: formulir, konfirmasi, otentikasi. Push cocok untuk melihat konten secara berurutan, di mana pengguna dapat dengan bebas kembali. Jendela modal tidak boleh berisi navigasi di dalamnya.

Gaya presentasi modal mana yang harus dipilih di iOS?

Mulai iOS 13, gaya default .automatic memilih .pageSheet untuk iPhone. .pageSheet cocok untuk sebagian besar skenario (formulir, detail). .fullScreen — untuk konten media (video, editor foto). .formSheet — untuk aplikasi iPad di mana jendela terpusat diperlukan.

Bagaimana cara mengimplementasikan jendela modal di Jetpack Compose?

Jetpack Compose menyediakan komponen Dialog untuk jendela modal sederhana dan ModalBottomSheet untuk panel bawah. Dialog menerima onDismissRequest dan konten dalam gaya Compose. Untuk menyimpan status, gunakan rememberSaveable di dalam dialog.

Bisakah jendela modal bersarang satu sama lain?

Apple HIG dan Material Design tidak merekomendasikan jendela modal bersarang. Jika pengguna membuka jendela modal di atas jendela modal lain, ia kehilangan konteks dan bisa bingung dalam hierarki. Alih-alih bersarang, gunakan Step Indicator atau pola Wizard dengan satu jendela modal.

Bagaimana cara menangani penutupan jendela modal saat kehilangan data?

Gunakan UIAdaptivePresentationControllerDelegate di iOS (metode presentationControllerShouldDismiss) atau OnBackPressedDispatcher di Android. Jika ada data yang belum disimpan, tampilkan AlertDialog dengan opsi: simpan, batalkan perubahan, tetap di layar. Ini mencegah kehilangan data secara tidak sengaja oleh pengguna.

Kesimpulan

  • Modal Presentation — pola navigasi yang memblokir interaksi dengan konten induk hingga tugas selesai.
  • iOS mendukung .fullScreen, .pageSheet, .formSheet melalui UIModalPresentationStyle dan .sheet di SwiftUI.
  • Android mengimplementasikan modalitas melalui DialogFragment, BottomSheet, dan Dialog di Jetpack Compose.
  • Modal berbeda dari Push dengan memblokir mundur dan memerlukan tindakan eksplisit untuk menutup.
  • Jendela modal tidak boleh melebihi 20% skenario navigasi dan tidak boleh bersarang.
  • Kehilangan data saat menutup jendela modal harus dicegah melalui delegasi dan dialog konfirmasi.
  • Disarankan memilih Page Sheet di iOS dan DialogFragment di Android untuk tugas modal standar.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga