Orientasi aplikasi dibatasi di ponsel, tetapi tidak di layar besar

Ikon rating bintang dua

Aplikasi Anda berfungsi dengan baik pada ponsel dalam orientasi potret, sehingga Anda membatasi aplikasi ke orientasi potret. Namun, Anda melihat peluang untuk melakukan lebih banyak hal pada perangkat layar besar dalam orientasi lanskap.

Bagaimana cara melakukan keduanya—membatasi aplikasi ke orientasi potret di layar kecil, tetapi mengaktifkan orientasi lanskap pada perangkat layar besar?

Praktik terbaik

Aplikasi terbaik menghormati preferensi pengguna seperti orientasi perangkat.

Panduan kualitas aplikasi Adaptif merekomendasikan agar aplikasi mendukung semua konfigurasi perangkat, termasuk orientasi potret dan lanskap, mode multi-aplikasi, serta status terlipat dan terbentang perangkat foldable. Aplikasi harus mengoptimalkan tata letak dan antarmuka pengguna untuk berbagai konfigurasi, dan aplikasi harus menyimpan serta memulihkan status selama perubahan konfigurasi.

Urutan langkah ini adalah tindakan sementara—dukungan kecil untuk perangkat layar besar. Gunakan urutan langkah ini hingga Anda dapat meningkatkan kualitas aplikasi untuk memberikan dukungan penuh bagi semua konfigurasi perangkat.

Bahan

  • screenOrientation: Setelan manifes aplikasi yang memungkinkan Anda menentukan respons aplikasi terhadap perubahan orientasi perangkat
  • Activity#setRequestedOrientation(): Metode yang dapat Anda gunakan untuk mengubah orientasi aplikasi saat runtime
  • LocalConfiguration: Penyedia lokal composable yang mengekspos Configuration perangkat saat ini, sehingga Anda dapat membaca dimensi layar dalam DP.
  • LaunchedEffect: Compose side-effect API yang menjalankan blok kode saat kunci berubah (dalam hal ini, saat konfigurasi berubah).

Langkah

Buat aplikasi agar mampu menangani perubahan orientasi secara default di manifes aplikasi. Kemudian, saat runtime, gunakan Jetpack Compose untuk membatasi orientasi secara dinamis ke potret pada layar ringkas (ponsel) sekaligus mengizinkan semua orientasi pada layar besar.

1. Menentukan setelan orientasi dalam manifes aplikasi

Anda dapat menghindari mendeklarasikan elemen screenOrientation dari manifes aplikasi (jika orientasi default adalah unspecified) atau menyetel orientasi layar ke fullUser. Jika pengguna belum mengunci rotasi berbasis sensor, aplikasi Anda akan mendukung semua orientasi perangkat.

<activity
    android:name=".MyActivity"
    android:screenOrientation="fullUser">

Perbedaan antara penggunaan unspecified dan fullUser kecil, tetapi penting. Jika Anda tidak mendeklarasikan nilai screenOrientation, sistem akan memilih orientasi, dan kebijakan yang digunakan sistem untuk menentukan orientasi mungkin berbeda dari satu perangkat ke perangkat lainnya. Di sisi lain, menentukan fullUser lebih cocok dengan perilaku yang ditentukan pengguna untuk perangkat: jika pengguna telah mengunci rotasi berbasis sensor, aplikasi akan mengikuti preferensi pengguna; jika tidak, sistem akan mengizinkan salah satu dari empat kemungkinan orientasi layar (potret, lanskap, potret terbalik, atau lanskap terbalik). Lihat android:screenOrientation.

2. Membatasi orientasi secara dinamis di Compose

Di Jetpack Compose, Anda dapat membaca dimensi layar saat ini dalam DP secara reaktif dari LocalConfiguration.current dan menggunakan LaunchedEffect untuk mengupdate orientasi Aktivitas setiap kali konfigurasi berubah.

Jika lebar atau tinggi layar kurang dari 600dp (sesuai dengan titik henti sementara ringkas untuk ponsel), batasi orientasi ke potret. Jika tidak, izinkan sistem memutar aplikasi berdasarkan preferensi pengguna (unspecified atau fullUser).

Berikut adalah implementasi lengkap yang dapat dikompilasi:

val configuration = LocalConfiguration.current
val context = LocalActivity.current

LaunchedEffect(configuration) {
    val activity = context ?: return@LaunchedEffect
    // Determine if screen is compact (phone-sized) in either width or height
    val isCompact = configuration.screenWidthDp < 600 || configuration.screenHeightDp < 600
    activity.requestedOrientation = if (isCompact) {
        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
    } else {
        ActivityInfo.SCREEN_ORIENTATION_FULL_USER
    }
}

Dengan menambahkan logika di dalam blok LaunchedEffect(configuration), Anda dapat mengganti setelan orientasi secara reaktif setiap kali konfigurasi aplikasi berubah, seperti saat aktivitas diubah ukurannya, dipindahkan di antara tampilan, atau saat perangkat foldable dilipat atau dibentangkan.

Untuk mengetahui informasi selengkapnya tentang kapan perubahan konfigurasi terjadi dan kapan perubahan tersebut menyebabkan pembuatan ulang aktivitas, lihat Menangani perubahan konfigurasi.

Hasil

Aplikasi Anda akan tetap dalam orientasi potret di layar kecil, apa pun rotasi perangkatnya. Pada perangkat layar besar, aplikasi akan mendukung orientasi lanskap dan potret.

Referensi lainnya

Untuk bantuan dalam melakukan upgrade aplikasi Anda agar selalu mendukung semua konfigurasi perangkat, lihat artikel berikut: