Mulai Android 10 (API level 29), sistem Android mendukung navigasi berbasis gestur sepenuhnya. Ada dua hal yang harus dilakukan developer aplikasi untuk memastikan aplikasi mereka kompatibel dengan fitur ini:
- Memperluas konten aplikasi dari tepi ke tepi.
- Menangani gestur aplikasi yang bertentangan.
Konten aplikasi tepi-ke-tepi
Untuk memanfaatkan ruang layar tambahan yang disediakan pada menu navigasi floating, Anda perlu membuat beberapa perubahan pada aplikasi.
Menyetel kolom sistem transparan
Anda dapat melakukannya dengan menyetel nilai berikut dalam tema Anda:
<!-- values-29/themes.xml: -->
<style name="AppTheme" parent="...">
<item name="android:navigationBarColor">@android:color/transparent</item>
<!-- Optional, but recommended for full edge-to-edge rendering -->
<item name="android:statusBarColor">@android:color/transparent</item>
</style>

Atau, Anda dapat melakukan tindakan ini secara dinamis dengan menggunakan Window.setNavigationBarColor()
dan Window.setStatusBarColor()
.
Ketika perangkat disetel menggunakan navigasi gestur, dan Anda membuat latar belakang menu navigasi aplikasi Anda transparan, sistem secara otomatis memperbarui warna handle berdasarkan warna konten di belakangnya. Namun, ketika pengguna berada dalam mode navigasi 2 tombol atau 3 tombol, tombol-tombol ini tidak berubah warna. Sebagai gantinya, sistem menerapkan latar belakang transparan sehingga tombol tetap terlihat. Namun, sistem hanya dapat melakukan ini jika aplikasi menargetkan API level 29 atau lebih tinggi.
Menyetel tanda visibilitas UI
Agar dapat mengatur tampilan tepi ke tepi, aplikasi Anda harus memberi tahu sistem bahwa aplikasi dapat menangani tampilan tersebut. Anda dapat melakukannya menggunakan View.setSystemUiVisibility()
untuk menyetel flag berikut:
Kotlin
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_STABLE)
Java
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
Secara bersama-sama, tanda ini memberi tahu sistem bahwa aplikasi Anda harus diletakkan pada layar penuh, dan seolah-olah menu navigasi dan status bar tidak ada di sana. Untuk aktivitas layar penuh lainnya, Anda juga dapat menetapkan SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
, yang memungkinkan Anda untuk menggambar di belakang status bar.
Jika Anda menggunakan class tampilan seperti CoordinatorLayout
atau DrawerLayout
yang otomatis menangani status bar, flag SYSTEM_UI_FLAG_LAYOUT_STABLE
dan SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
mungkin telah ditetapkan. Selain itu, jika Anda menggunakan setSystemUiVisibility()
untuk menetapkan flag lain, seperti SYSTEM_UI_FLAG_IMMERSIVE
, Anda harus berhati-hati bahwa flag lain tersebut tidak menimpa yang dirujuk di atas.
Meskipun aplikasi Anda menggunakan tampilan tepi ke tepi, sistem masih menggunakan API WindowInsets
untuk menunjukkan posisi kolom sistem.
Menggunakan inset secara manual
Jika aplikasi Anda menggunakan hierarki tampilan kustom, Anda mungkin perlu menggunakan inset jendela sistem secara manual. Ini biasanya dapat dilakukan dengan mengimplementasikan antarmuka OnApplyWindowInsetsListener
:
Kotlin
view.setOnApplyWindowInsetsListener() {v, insets -> insets.consumeSystemWindowInsets()
Java
view.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { @Override public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { // 1. Move views on top edge down by insets.getSystemWindowInsetTop() // 2. Move views on bottom edge up by insets.getSystemWindowInsetBottom() // 3. Also check getSystemWindowInsetLeft/Right(), such as for landscape // orientations return insets.consumeSystemWindowInsets(); } });
WindowInsets
menyediakan inset visual biasa untuk semua kolom sistem melalui getSystemWindowInsets()
. Selain itu, Android 10 menambahkan metode berikut ke WindowInsets
:
getSystemGestureInsets()
: Menunjukkan ukuran wilayah posisi gestur sistem ditangkap.getMandatorySystemGestureInsets()
: Sama seperti di atas, tetapi hanya menunjukkan wilayah yang tidak dapat ditimpa olehView.setSystemGestureExclusionRects()
.
Menangani gestur aplikasi yang bertentangan
Model navigasi gestur mungkin bertentangan dengan gestur yang sebelumnya digunakan oleh developer aplikasi. Oleh karena itu, Anda mungkin perlu melakukan penyesuaian pada antarmuka pengguna aplikasi.
Konflik dengan gestur Kembali
Gestur sistem baru untuk Kembali adalah geser ke dalam dari tepi kiri atau kanan layar. Hal ini dapat mengganggu elemen navigasi aplikasi di area tersebut. Untuk mempertahankan fungsi elemen di tepi kiri dan kanan layar, Anda harus menghentikan gestur Kembali secara selektif dengan menunjukkan kepada sistem area mana yang perlu menerima input sentuhan. Anda dapat melakukannya dengan meneruskan List<Rect>
ke API View.setSystemGestureExclusionRects()
yang diperkenalkan di Android 10. Metode ini juga tersedia di ViewCompat
pada androidx.core:core:1.1.0-dev01
.
Contoh:
Kotlin
var exclusionRects = listOf(rect1, rect2, rect3) fun onLayout( changedCanvas: Boolean, left: Int, top: Int, right: Int, bottom: Int) { // Update rect bounds and the exclusionRects list setSystemGestureExclusionRects(exclusionRects) } fun onDraw(canvas: Canvas) { // Update rect bounds and the exclusionRects list setSystemGestureExclusionRects(exclusionRects) }
Java
List<Rect> exclusionRects; public void onLayout( boolean changedCanvas, int left, int top, int right, int bottom) { // Update rect bounds and the exclusionRects list setSystemGestureExclusionRects(exclusionRects); } public void onDraw(Canvas canvas) { // Update rect bounds and the exclusionRects list setSystemGestureExclusionRects(exclusionRects); }
Konflik dengan gestur Beranda/Beralih Cepat
Gestur sistem baru untuk Beranda dan Beralih Cepat melibatkan gestur geser di bagian bawah layar di area yang sebelumnya ditempati menu navigasi. Aplikasi tidak dapat keluar dari gestur ini, karena gestur tersebut dapat bertentangan dengan gestur Kembali.
Untuk mengurangi masalah ini, Android 10 memperkenalkan API WindowInsets.getMandatorySystemGestureInsets()
, yang menginformasikan ambang pengenalan sentuhan kepada aplikasi.
Game dan aplikasi non-Tampilan lainnya
Game dan aplikasi lain yang tidak memiliki hierarki tampilan sering mengharuskan pengguna untuk menggeser di dekat area gestur sistem. Dalam kasus tersebut, game dapat menggunakan Window.setSystemGestureExclusionRects()
untuk mengecualikan area yang tumpang tindih dengan area yang disediakan untuk gestur sistem. Game harus memastikan untuk mengecualikan area ini saja jika diperlukan, misalnya selama game dijalankan.
Jika game mengharuskan pengguna untuk menggeser di dekat area gestur beranda, aplikasi dapat meminta untuk ditempatkan dalam mode imersif. Hal ini akan menonaktifkan gestur sistem selagi pengguna berinteraksi dengan game, tetapi memungkinkan pengguna untuk mengaktifkan kembali gestur sistem dengan menggeser dari bagian bawah layar.
Referensi lainnya
Untuk mempelajari navigasi gestur lebih lanjut, baca referensi tambahan berikut.