Metode # 1:
Untuk mencapai bilah status yang benar-benar transparan, Anda harus menggunakannya statusBarColor
, yang hanya tersedia di API 21 ke atas. windowTranslucentStatus
tersedia di API 19 dan di atasnya, tetapi menambahkan latar belakang berwarna untuk bilah status. Namun, pengaturan windowTranslucentStatus
memang mencapai satu hal yang tidak berubah statusBarColor
menjadi transparan: ia menetapkan SYSTEM_UI_FLAG_LAYOUT_STABLE
dan SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
menandai. Cara termudah untuk mendapatkan efek yang sama adalah dengan secara manual mengatur flag-flag ini, yang secara efektif menonaktifkan insets yang diberlakukan oleh sistem tata letak Android dan membuat Anda berjuang sendiri.
Anda menyebut baris ini dalam onCreate
metode Anda :
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Pastikan juga mengatur transparansi di /res/values-v21/styles.xml:
<item name="android:statusBarColor">@android:color/transparent</item>
Atau atur transparansi secara terprogram:
getWindow().setStatusBarColor(Color.TRANSPARENT);
Sisi baik dari pendekatan ini adalah bahwa tata letak dan desain yang sama juga dapat digunakan pada API 19 dengan memperdagangkan bilah status transparan untuk bilah status transparan yang berwarna.
<item name="android:windowTranslucentStatus">true</item>
Metode # 2:
Jika Anda hanya perlu melukis gambar latar belakang di bawah bilah status Anda, alih-alih memposisikan tampilan di belakangnya, ini dapat dilakukan dengan hanya mengatur latar belakang tema aktivitas Anda ke gambar yang diinginkan dan mengatur transparansi bilah status seperti ditunjukkan dalam metode # 1. Ini adalah metode yang saya gunakan untuk membuat tangkapan layar untuk artikel Android Police dari beberapa bulan yang lalu.
Metode # 3:
Jika Anda harus mengabaikan insets sistem standar untuk beberapa tata letak sembari tetap membuatnya bekerja pada yang lain, satu-satunya cara yang layak untuk melakukannya adalah bekerja dengan kelas yang sering dikaitkan ScrimInsetsFrameLayout
. Tentu saja, beberapa hal yang dilakukan di kelas itu tidak diperlukan untuk semua skenario. Misalnya, jika Anda tidak berencana untuk menggunakan overlay bilah status sintetis, cukup komentari semuanya dalam init()
metode ini dan jangan repot-repot menambahkan apa pun ke file attrs.xml. Saya telah melihat pendekatan ini berhasil, tetapi saya pikir Anda akan menemukan bahwa itu membawa beberapa implikasi lain yang mungkin banyak pekerjaan untuk diselesaikan.
Saya juga melihat bahwa Anda menentang membungkus banyak tata letak. Dalam hal membungkus satu tata letak di dalam yang lain, di mana keduanya memiliki match_parent
tinggi dan lebar, implikasi kinerja terlalu sepele untuk dikhawatirkan. Apa pun itu, Anda dapat menghindari situasi itu sepenuhnya dengan mengubah kelas yang dimilikinya dari FrameLayout
jenis kelas Layout lain yang Anda suka. Ini akan bekerja dengan baik.
android:fitsSystemWindows="true"