Pengelolaan keyboard yang dapat dilepas

Ikon rating bintang tiga

Dukungan untuk keyboard yang dapat dilepas membantu memaksimalkan produktivitas pengguna di perangkat layar besar. Android memicu perubahan konfigurasi setiap kali keyboard terpasang atau dilepas dari perangkat, yang dapat menyebabkan hilangnya status UI. Aplikasi Anda dapat menyimpan dan memulihkan statusnya, sehingga sistem dapat menangani pembuatan ulang aktivitas, atau membatasi pembuatan ulang aktivitas untuk perubahan konfigurasi keyboard.

Dalam semua kasus, semua data yang terkait dengan keyboard disimpan dalam Configuration objek. Kolom keyboard dan keyboardHidden dari objek konfigurasi berisi informasi tentang jenis keyboard dan ketersediaannya.

Praktik terbaik

Aplikasi yang dioptimalkan untuk perangkat layar besar mendukung setiap jenis perangkat input, mulai dari keyboard software dan hardware hingga stilus, mouse, trackpad, dan perangkat periferal lainnya.

Dukungan untuk keyboard eksternal melibatkan perubahan konfigurasi, yang dapat Anda kelola dengan salah satu dari dua cara berikut:

  1. Biarkan sistem membuat ulang aktivitas yang sedang berjalan, dan Anda menangani pengelolaan status aplikasi.
  2. Kelola sendiri perubahan konfigurasi (aktivitas tidak akan dibuat ulang):
    • Deklarasikan semua nilai konfigurasi terkait keyboard
    • Buat pengendali perubahan konfigurasi

Aplikasi produktivitas, yang sering kali memerlukan kontrol UI yang baik untuk entri teks dan input lainnya, dapat memanfaatkan pendekatan mandiri untuk menangani perubahan konfigurasi.

Dalam kasus khusus, Anda mungkin ingin mengubah tata letak aplikasi saat keyboard hardware terpasang atau dilepas, misalnya, untuk menyediakan lebih banyak ruang bagi alat atau jendela pengeditan.

Di Jetpack Compose, Anda dapat bereaksi terhadap perubahan konfigurasi keyboard dengan dua cara:

  1. UI Reaktif: Baca status konfigurasi saat ini langsung di Composable menggunakan LocalConfiguration.current. UI secara otomatis melakukan rekomposisi untuk beradaptasi dengan status baru saat keyboard terpasang atau dilepas.
  2. Callback Efek Samping: Gunakan DisposableEffect yang memperhatikan siklus proses untuk mendaftarkan pemroses perubahan konfigurasi di Aktivitas host, yang memungkinkan Anda memicu peristiwa non-UI (seperti logging atau analisis) tanpa membuat ulang aktivitas atau membuat instance elemen tampilan dummy.

Bahan

  • android:configChanges: Atribut elemen <activity> manifes aplikasi. Memberi tahu sistem tentang perubahan konfigurasi yang dikelola aplikasi.
  • LocalConfiguration: Penyedia lokal composable yang mengekspos perangkat Configuration.
  • DisposableEffect: API efek samping Compose yang menjalankan blok kode saat Composable memasuki komposisi, dan membersihkan saat keluar.

Langkah

Deklarasikan atribut configChanges dan tambahkan nilai terkait keyboard untuk mencegah pembuatan ulang aktivitas. Kemudian, gunakan LocalConfiguration.current untuk menyesuaikan tata letak Composable secara dinamis, atau daftarkan pemroses konfigurasi menggunakan DisposableEffect.

1. Deklarasikan atribut configChanges

Perbarui elemen <activity> di manifes aplikasi dengan menambahkan nilai keyboard|keyboardHidden ke daftar perubahan konfigurasi yang sudah dikelola:

<activity
            android:configChanges="...|keyboard|keyboardHidden">

2. Menanggapi perubahan konfigurasi keyboard

Untuk menangani perubahan konfigurasi di Jetpack Compose, gunakan salah satu opsi berikut, bergantung pada apakah Anda memperbarui UI atau menjalankan callback efek samping:

  • Opsi A: UI Reaktif (Direkomendasikan)

    Baca jenis keyboard langsung dari LocalConfiguration.current. Saat keyboard hardware terpasang atau dilepas, nilai ini akan berubah, dan Compose akan otomatis melakukan rekomposisi UI Anda.

    val configuration = LocalConfiguration.current
    val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY
    
    if (isPhysicalKeyboardAttached) {
        // Render layout optimized for physical keyboard
    } else {
        // Render default layout
    }

  • Opsi B: Pemroses Efek Samping

    Jika Anda perlu menjalankan efek samping (seperti logging, memperbarui database lokal, atau memicu analisis) saat konfigurasi berubah, gunakan DisposableEffect untuk mendaftarkan pemroses perubahan konfigurasi di ComponentActivity host.

    val context = LocalActivity.current
    DisposableEffect(context) {
        val activity = context as? ComponentActivity
        val listener = Consumer<Configuration> { newConfig ->
            val hasKeyboard = newConfig.keyboard == Configuration.KEYBOARD_QWERTY
            // Trigger non-UI actions, analytics, etc.
        }
        activity?.addOnConfigurationChangedListener(listener)
        onDispose {
            activity?.removeOnConfigurationChangedListener(listener)
        }
    }

Hasil

Aplikasi Anda kini akan merespons keyboard eksternal yang terpasang atau dilepas tanpa membuat ulang aktivitas yang sedang berjalan.

Referensi lainnya

Untuk mempelajari cara menyimpan status UI aplikasi selama perubahan konfigurasi seperti pemasangan atau pelepasan keyboard, lihat Menyimpan status UI.