Pengelolaan jendela

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

Gambar 1. Jendela aplikasi di perangkat lain.

Penting untuk merancang tata letak yang berfungsi dengan ukuran layar yang berbeda. Jika Anda mengikuti panduan Android untuk mendukung berbagai ukuran layar, aplikasi Anda juga akan berfungsi dengan baik saat berjalan di ChromeOS.

Halaman ini menunjukkan cara memastikan jendela aplikasi diluncurkan dengan benar, berubah ukurannya dengan lancar, dan menampilkan semua kontennya saat 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 Anda untuk menentukan ukuran awal "tetap", 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.

Mengubah ukuran jendela

Di ChromeOS, pengguna dapat mengubah ukuran jendela aplikasi seperti biasa: dengan menarik sudut 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:

  • Respons 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 gunakan komponen arsitektur ViewModel untuk memulihkan status tersimpan sebelumnya.

Saat menggunakan Jetpack Compose, perilaku pengubahan ukuran bergantung pada cara aktivitas Anda dikonfigurasi. Jika menangani perubahan secara dinamis, rekomposisi akan dipicu saat ukuran jendela berubah. Jika aktivitas dimulai ulang oleh sistem, komposisi awal akan terjadi setelah mulai ulang. Apa pun caranya, penting untuk membuat tata letak Compose yang beradaptasi dengan perubahan ukuran jendela. Jangan mengasumsikan ukuran tetap.

Dimensi jendela

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

Untuk menentukan konfigurasi saat ini, panggil getResources().getConfiguration() pada aktivitas saat ini. Jangan gunakan konfigurasi aktivitas latar belakang atau resource sistem. Aktivitas latar belakang tidak memiliki ukuran, dan konfigurasi sistem mungkin berisi beberapa jendela dengan orientasi dan ukuran yang bertentangan, sehingga tidak ada data yang dapat digunakan yang 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 dapat berubah setelah pengubahan 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 native harus membaca area yang tersedia dan memantau perubahan ukuran untuk menghindari 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 prapenskalaan pada posternya, lakukan hal tersebut 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 jendela di 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 Anda tidak menggunakan sistem tampilan dan mengambil alih permukaan, aplikasi Anda harus menangani perubahan ukuran sendiri.
  • Untuk aplikasi native, gunakan anggota mLastContent atau gunakan tampilan konten untuk menentukan ukuran awal.
  • Saat aplikasi berjalan, proses peristiwa onContentRectChangedNative atau onGlobalLayout untuk bereaksi terhadap perubahan ukuran.
  • Saat ukuran aplikasi berubah, skalakan ulang atau muat ulang tata letak dan poster serta perbarui area input.

Mode layar penuh

Mode layar penuh berfungsi sama seperti di Android. Jika jendela tidak menutupi layar penuh, permintaan untuk menampilkan 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. Guna mendapatkan hasil terbaik untuk aplikasi Anda, sebaiknya dukung kedua orientasi.

Beberapa aplikasi Android berasumsi bahwa jika perangkat dipegang dalam mode potret, nilai rotasinya adalah Surface.ROTATION_0. Hal ini mungkin berlaku untuk sebagian besar perangkat Android. Namun, saat aplikasi berada dalam mode ARC tertentu, nilai rotasi untuk orientasi potret mungkin bukan 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 mirip dengan mode berdampingan Android: aktivitas di bagian bawah tumpukan mengontrol atribut semua aktivitas di atasnya. Hal ini dapat menyebabkan situasi tidak terduga saat aktivitas yang baru dimulai yang bersifat potret dan tidak dapat diubah ukurannya menjadi lanskap dan dapat diubah ukurannya.

Mode perangkat memiliki efek 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 berbentuk 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 terhenti di jendela berukuran potret kecil dan tidak dapat kembali ke jendela lanskap yang lebih besar.
  • 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 orientasi aktivitas adalah potret, tetapi aplikasi memanggil setRequestedOrientation(LANDSCAPE) pada runtime, hal ini akan menyebabkan pengubahan ukuran jendela yang tidak perlu, yang mengganggu pengguna dan mungkin memulai ulang aplikasi, sehingga aplikasi 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 menggunakan aplikasi Android di ChromeOS:

  • Jangan memanggil finish() dalam metode onDestroy aktivitas Anda. Tindakan ini akan 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 secara cepat dengan meng-cache objek yang telah dialokasikan sebelumnya.
  • Jika tidak ingin pengguna mengubah ukuran aplikasi, tentukan android:resizeableActivity=false dalam file manifes Anda.
  • Uji aplikasi Anda untuk memastikan bahwa aplikasi dapat menangani perubahan ukuran jendela dengan tepat.