Pengelolaan jendela

ChromeOS mendukung aplikasi Android di beberapa jendela. Sistem merender aplikasi ke dalam kontainer jendela yang ukurannya ditentukan oleh faktor bentuk seperti yang ditunjukkan pada gambar 1.

Gambar 1. Jendela aplikasi di perangkat yang berbeda.

Penting untuk mendesain tata letak yang berfungsi dengan berbagai ukuran layar. Jika Anda ikuti panduan Android untuk mendukung berbagai jenis layar ukuran aplikasi, aplikasi Anda juga akan berfungsi dengan baik saat menjalankan ChromeOS.

Halaman ini menunjukkan cara memastikan jendela aplikasi diluncurkan dengan benar, mengubah ukurannya dengan lancar, dan menampilkan semua isinya ketika ukurannya berubah.

Ukuran peluncuran awal

Aplikasi dapat meminta ukuran peluncuran awal dengan cara berikut:

  • Menggunakan ukuran peluncuran hanya di lingkungan desktop. Tindakan ini membantu pengelola jendela memberi Anda batas dan orientasi yang tepat. Untuk menunjukkan preferensi jika digunakan dalam mode desktop, tambahkan tag meta berikut di dalam <activity>:
<meta-data android:name="WindowManagerPreference:FreeformWindowSize"
           android:value="[phone|tablet|maximize]" />
<meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
           android:value="[portrait|landscape]" />
  • Menggunakan batas peluncuran statis. Gunakan <layout> di dalam entri manifes aktivitas untuk menentukan ukuran awal, seperti dalam contoh berikut:
<layout android:defaultHeight="500dp"
            android:defaultWidth="600dp"
            android:gravity="top|end"
            android:minHeight="450dp"
            android:minWidth="300dp" />
  • Menggunakan batas peluncuran dinamis. Suatu aktivitas dapat membuat dan menggunakan ActivityOptions.setLaunchBounds(Rect) saat membuat aktivitas baru. Dengan menentukan persegi panjang kosong, aplikasi Anda dapat diluaskan maksimal.

Ubah ukuran jendela

Di ChromeOS, pengguna dapat mengubah ukuran jendela aplikasi seperti biasa: dengan menarik pojok kanan bawah, seperti yang ditunjukkan pada gambar 2.

Gambar 2. Jendela aplikasi yang dapat diubah ukurannya.

Ada dua opsi untuk menangani pengubahan ukuran jendela saat menggunakan Class View:

  • Merespons perubahan konfigurasi secara dinamis dengan memanggil onConfigurationChanged(..). Sebagai contoh, Anda dapat menambahkan android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" ke manifes aktivitas. Untuk informasi selengkapnya tentang menangani perubahan konfigurasi, baca Menangani perubahan konfigurasi.
  • Biarkan sistem memulai ulang aktivitas. Dalam hal ini, implementasikan onSaveInstanceState dan menggunakan arsitektur ViewModel komponen untuk memulihkan status tersimpan.

Saat menggunakan Jetpack Compose, perilaku perubahan ukuran bergantung pada konfigurasi aktivitas Anda. Jika menangani perubahan secara dinamis, rekomposisi dipicu saat ukuran jendela berubah. Jika aktivitas tersebut dimulai ulang oleh sistem, komposisi awal terjadi setelah dimulai ulang. Keduanya penting untuk membuat tata letak Compose yang beradaptasi dengan perubahan jendela ukuran. Jangan mengasumsikan ukuran tetap.

Dimensi jendela

Minta aktivitas Anda membaca dimensi jendelanya setiap kali aktivitas tersebut dimulai dan mengatur kontennya sesuai dengan konfigurasi saat ini.

Untuk menentukan konfigurasi saat ini, panggil getResources().getConfiguration() pada aktivitas saat ini. Jangan gunakan untuk aktivitas latar belakang atau resource sistem. Aktivitas latar belakang tidak memiliki ukuran, dan konfigurasi sistem mungkin berisi beberapa jendela dengan ukuran dan orientasi yang bertentangan, sehingga tidak dapat digunakan data dapat diekstrak.

Perhatikan bahwa ukuran jendela dan ukuran layar tidak sama. Untuk mendapatkan ukuran jendela di DP, gunakan Activity.getResources().getConfiguration().screenWidth dan Activity.getResources().getConfiguration().screenHeight. Anda mungkin tidak perlu menggunakan ukuran layar.

Batas konten

Batas konten jendela bisa berubah setelah mengubah ukuran. Misalnya, area dalam jendela yang digunakan oleh aplikasi dapat berubah jika jendela menjadi terlalu besar untuk masuk ke layar. Ikuti pedoman berikut:

  • Aplikasi yang menggunakan proses tata letak Android akan secara otomatis diletakkan di ruang yang tersedia.
  • Aplikasi bawaan harus membaca area yang tersedia dan memantau perubahan ukuran untuk menghindari memiliki elemen UI yang tidak dapat diakses. Panggil metode berikut guna menentukan ukuran awal yang tersedia untuk permukaan ini:

    • NativeActivity.mLastContent[X/Y/Width/Height]()
    • findViewById(android.R.id.content).get[Width/Height]()

    Pemantauan berkelanjutan dapat dilakukan menggunakan observer:

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • Tambahkan pemroses ke view.addOnLayoutChangeListener(findViewById(android.R.id.content))

    Jika aplikasi melakukan pra-penskalaan pada posternya, lakukan setiap kali resolusi berubah.

Mengubah ukuran dengan format bebas

ChromeOS memungkinkan jendela apa pun diubah ukurannya secara bebas: pengguna dapat mengubah lebar, tinggi, dan posisi pada layar. Banyak aplikasi Android yang ditulis tanpa perlu mengubah ukuran dengan format bebas. Pertimbangkan masalah berikut:

  • Posisi layar mungkin berubah. Selalu gunakan sistem untuk melakukan transformasi koordinat jendela ke layar dan sebaliknya.
  • Jika Anda menggunakan sistem tampilan Android, tata letak jendela akan berubah secara otomatis saat ukurannya berubah.
  • Jika tidak menggunakan sistem tampilan dan mengambil alih platform, aplikasi Anda harus menangani perubahan ukuran secara mandiri.
  • Untuk aplikasi native, gunakan anggota mLastContent atau gunakan tampilan konten untuk menentukan ukuran awal.
  • Saat aplikasi berjalan, dengarkan onContentRectChangedNative atau onGlobalLayout peristiwa untuk bereaksi terhadap perubahan ukuran.
  • Saat ukuran aplikasi berubah, skalakan ulang atau muat ulang tata letak dan poster dan memperbarui area input.

Mode layar penuh

Mode layar penuh berfungsi sama seperti di Android bawaan. Jika jendela tidak menutupi layar penuh, minta layar penuh (menyembunyikan semua elemen UI sistem) akan diabaikan. Jika jendela aplikasi diluaskan maksimal, metode, tata letak, dan fungsi normal mode layar penuh akan diterapkan. Ini akan menyembunyikan elemen UI sistem (panel kontrol jendela dan rak).

Orientasi layar

Orientasi yang paling umum untuk aplikasi Android adalah potret, karena sebagian besar ponsel dipegang dengan cara ini. Meskipun potret baik untuk ponsel, namun buruk untuk laptop dan tablet. Lanskap lebih disukai. Untuk mendapatkan aplikasi Anda memberikan hasil terbaik, pertimbangkan untuk mendukung kedua orientasi.

Beberapa aplikasi Android berasumsi bahwa bila perangkat dipegang dalam mode potret, nilai rotasi adalah Surface.ROTATION_0. Hal ini mungkin berlaku untuk sebagian besar perangkat Android. Namun, saat aplikasi berada dalam tertentu Mode ARC, nilai rotasi untuk orientasi potret mungkin tidak Surface.ROTATION_0.

Untuk mendapatkan nilai rotasi yang akurat saat membaca akselerometer atau sensor yang serupa, gunakan metode Display.getRotation() dan ganti sumbunya dengan yang sesuai.

Aktivitas dan orientasi root

Jendela Chromebook terdiri dari setumpuk jendela aktivitas. Setiap jendela dalam tumpukan ini memiliki ukuran dan orientasi yang sama.

Perubahan orientasi dan ukuran secara tiba-tiba akan membingungkan jika terjadi di lingkungan desktop. Pengelola jendela Chromebook menghindari hal ini dengan cara yang sama ke mode berdampingan Android: aktivitas di bagian bawah kontrol tumpukan atribut dari semua aktivitas di atasnya. Hal ini dapat menyebabkan situasi yang tidak terduga saat aktivitas yang baru dimulai yaitu potret dan tidak dapat diubah ukurannya menjadi lanskap dan dapat diubah ukurannya.

Mode perangkat memiliki pengaruh di sini: dalam mode tablet, orientasi tidak dikunci, dan setiap jendela mempertahankan orientasinya sendiri, seperti biasa di Android.

Panduan orientasi

Ikuti panduan penanganan orientasi berikut:

  • Jika Anda hanya mendukung satu orientasi, tambahkan informasi ke manifes sehingga pengelola jendela mengetahuinya sebelum memulai aplikasi. Saat Anda menentukan orientasi, tentukan juga orientasi sensor jika memungkinkan. Chromebook sering kali konvertibel, dan aplikasi yang terbalik akan memberikan pengalaman pengguna yang buruk.
  • Cobalah untuk tetap menggunakan satu orientasi yang dipilih. Hindari meminta satu orientasi dalam manifes dan menetapkan orientasi lainnya secara terprogram nanti.
  • Berhati-hatilah saat mengubah orientasi berdasarkan ukuran jendela. Pengguna mungkin mendapatkan tertahan di jendela berukuran potret kecil dan tidak dapat kembali ke jendela lanskap.
  • Ada kontrol jendela di Chrome untuk beralih antara semua tata letak yang tersedia. Dengan memilih opsi orientasi yang benar, Anda dapat memastikan bahwa pengguna memiliki tata letak yang benar setelah meluncurkan aplikasi. Jika aplikasi tersedia dalam mode potret dan lanskap, jadikan default untuk lanskap, jika memungkinkan. Setelah opsi ini disetel, opsi akan diingat pada basis per aplikasi.
  • Cobalah untuk menghindari perubahan orientasi yang tidak perlu. Misalnya, jika aktivitas orientasinya adalah potret, tetapi aplikasi memanggil setRequestedOrientation(LANDSCAPE) saat runtime, hal ini menyebabkan pengubahan ukuran jendela yang tidak perlu, yang mengganggu pengguna dan mungkin memulai ulang aplikasi itu tidak dapat menanganinya. Sebaiknya Anda menetapkan orientasi sekali, misalnya, dalam manifes, dan hanya mengubahnya jika perlu.

Pertimbangan lainnya

Berikut beberapa hal lain yang perlu dipertimbangkan saat bekerja dengan aplikasi Android di ChromeOS:

  • Jangan memanggil finish() dalam metode onDestroy aktivitas Anda. Hal ini menyebabkan aplikasi ditutup setelah mengubah ukuran dan tidak memulai ulang.
  • Jangan gunakan jenis jendela yang tidak kompatibel, seperti TYPE_KEYGUARD dan TYPE_APPLICATION_MEDIA.
  • Buat aktivitas dimulai ulang cepat dengan meng-cache objek yang telah telah dialokasikan sebelumnya.
  • Jika Anda tidak ingin pengguna mengubah ukuran aplikasi Anda, tentukan android:resizeableActivity=false dalam file manifes Anda.
  • Uji aplikasi Anda untuk memastikan bahwa aplikasi dapat menangani perubahan ukuran jendela dengan tepat.