Pengelolaan keyboard yang dapat dilepas

Ikon rating bintang tiga

Dukungan untuk keyboard lepas pasang membantu memaksimalkan produktivitas pengguna di perangkat layar besar. Android memicu perubahan konfigurasi setiap kali keyboard dipasang 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 objek Configuration. 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:

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

Aplikasi produktivitas, yang sering kali memerlukan kontrol UI yang mendetail 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 dipasang atau dilepas, misalnya, untuk memberikan lebih banyak ruang bagi alat atau jendela pengeditan.

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

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

Bahan

  • android:configChanges: Atribut elemen <activity> manifes aplikasi. Memberi tahu sistem tentang perubahan konfigurasi yang dikelola aplikasi.
  • LocalConfiguration: Penyedia lokal composable yang mengekspos Configuration perangkat saat ini.
  • DisposableEffect: API efek samping Compose yang menjalankan blok kode saat Composable memasuki komposisi, dan melakukan pembersihan 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. Mendeklarasikan atribut configChanges

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

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

2. Merespons perubahan konfigurasi keyboard

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

  • Opsi A: UI Reaktif (Direkomendasikan)

    Baca jenis keyboard langsung dari LocalConfiguration.current. Saat keyboard hardware dipasang atau dilepas, nilai ini akan berubah, dan Compose akan otomatis merekomposisi 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 dipasang 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.