Menyembunyikan status bar

Tutorial ini menjelaskan cara menyembunyikan status bar di berbagai versi Android. Menyembunyikan status bar (dan secara opsional, menu navigasi) memungkinkan konten menggunakan lebih banyak ruang tampilan, sehingga memberikan pengalaman pengguna yang lebih imersif.

Gambar 1 menunjukkan aplikasi dengan status bar yang terlihat:

kolom sistem

Gambar 1. Status bar terlihat.

Gambar 2 menunjukkan aplikasi dengan status bar tersembunyi. Perhatikan bahwa panel tindakan juga tersembunyi. Anda tidak boleh menampilkan panel tindakan tanpa status bar.

kolom sistem

Gambar 2. Status bar tersembunyi.

Menyembunyikan Status Bar di Android 4.0 dan yang Lebih Rendah

Anda dapat menyembunyikan status bar di Android 4.0 (API level 14) dan yang lebih rendah dengan menetapkan tanda WindowManager. Anda dapat melakukan ini secara terprogram atau dengan menyetel tema aktivitas di file manifes aplikasi Anda. Menyetel tema aktivitas dalam file manifes aplikasi Anda adalah pendekatan yang lebih disukai jika status bar harus selalu tetap tersembunyi di aplikasi Anda (meskipun, Anda dapat mengganti tema secara terprogram jika menghendakinya). Contoh:

    <application
        ...
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
        ...
    </application>
    

Keuntungan menggunakan tema aktivitas adalah sebagai berikut:

  • Lebih mudah dipertahankan dan lebih tidak rentan error dibandingkan menyetel flag secara terprogram.
  • Setelan ini menghasilkan transisi UI yang lebih halus, karena sistem memiliki informasi yang diperlukan untuk merender UI Anda sebelum membuat instance aktivitas utama aplikasi Anda.

Atau, Anda dapat menetapkan tanda WindowManager secara terprogram. Pendekatan ini mempermudah dalam menyembunyikan dan menampilkan status bar saat pengguna berinteraksi dengan aplikasi Anda:

Kotlin

    class MainActivity : Activity() {

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            // If the Android version is lower than Jellybean, use this call to hide
            // the status bar.
            if (Build.VERSION.SDK_INT < 16) {
                window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                        WindowManager.LayoutParams.FLAG_FULLSCREEN)
            }
            setContentView(R.layout.activity_main)
        }
        ...
    }
    

Java

    public class MainActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // If the Android version is lower than Jellybean, use this call to hide
            // the status bar.
            if (Build.VERSION.SDK_INT < 16) {
                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                        WindowManager.LayoutParams.FLAG_FULLSCREEN);
            }
            setContentView(R.layout.activity_main);
        }
        ...
    }
    

Saat Anda menetapkan tanda WindowManager (baik melalui tema aktivitas maupun secara terprogram), tanda tersebut tetap berlaku kecuali aplikasi Anda menghapusnya.

Anda dapat menggunakan FLAG_LAYOUT_IN_SCREEN untuk menetapkan tata letak aktivitas agar dapat menggunakan area layar sama dengan yang tersedia saat Anda mengaktifkan FLAG_FULLSCREEN. Langkah ini mencegah konten Anda berubah ukuran saat status bar disembunyikan dan ditampilkan.

Sembunyikan Status Bar di Android 4.1 dan yang Lebih Tinggi

Anda dapat menyembunyikan status bar di Android 4.1 (API level 16) dan yang lebih tinggi menggunakan setSystemUiVisibility(). setSystemUiVisibility() menetapkan tanda UI di level tampilan individual; setelan ini digabungkan ke level jendela. Menggunakan setSystemUiVisibility() untuk menetapkan tanda UI memberi Anda kontrol yang lebih terperinci pada kolom sistem dibandingkan menggunakan tanda WindowManager. Cuplikan ini menyembunyikan status bar:

Kotlin

    // Hide the status bar.
    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
    // Remember that you should never show the action bar if the
    // status bar is hidden, so hide that too if necessary.
    actionBar?.hide()
    

Java

    View decorView = getWindow().getDecorView();
    // Hide the status bar.
    int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
    decorView.setSystemUiVisibility(uiOptions);
    // Remember that you should never show the action bar if the
    // status bar is hidden, so hide that too if necessary.
    ActionBar actionBar = getActionBar();
    actionBar.hide();
    

Perhatikan hal berikut:

  • Setelah flag UI dihapus (misalnya, dengan keluar dari aktivitas), aplikasi harus direset jika Anda ingin menyembunyikan bar kembali. Lihat Merespons Perubahan Visibilitas UI untuk pembahasan tentang cara memproses perubahan visibilitas UI sehingga aplikasi Anda dapat merespons dengan benar.
  • Tempat Anda menetapkan tanda UI akan membuat perbedaan. Jika Anda menyembunyikan kolom sistem dengan metode onCreate() aktivitas dan pengguna menekan Home, kolom sistem akan muncul kembali. Saat pengguna membuka kembali aktivitas, onCreate() tidak akan terpanggil, sehingga kolom sistem akan tetap terlihat. Jika Anda ingin perubahan UI sistem tetap ada saat pengguna masuk dan keluar dari aktivitas Anda, tetapkan tanda UI di onResume() atau onWindowFocusChanged().
  • Metode setSystemUiVisibility() hanya akan berpengaruh jika tampilan yang Anda gunakan untuk memanggilnya terlihat.
  • Keluar dari tampilan menyebabkan tanda yang ditetapkan dengan setSystemUiVisibility() akan dihapus.

Memunculkan Konten Di Belakang Status Bar

Pada Android 4.1 dan yang lebih tinggi, Anda dapat menyetel konten aplikasi agar muncul di belakang status bar, sehingga konten tidak berubah ukuran saat status bar disembunyikan dan ditampilkan. Untuk melakukannya, gunakan SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. Anda mungkin juga perlu menggunakan SYSTEM_UI_FLAG_LAYOUT_STABLE untuk membantu aplikasi Anda menstabilkan tata letak.

Jika menggunakan pendekatan ini, Anda bertanggung jawab untuk memastikan bahwa bagian penting dari UI aplikasi Anda (misalnya, kontrol bawaan dalam aplikasi Maps) tidak tertutup oleh kolom sistem. Hal ini dapat membuat aplikasi Anda tidak dapat digunakan. Pada sebagian besar kasus, Anda dapat menanganinya dengan menambahkan atribut android:fitsSystemWindows ke file tata letak XML, ditetapkan ke true. Hal ini menyesuaikan padding dari ViewGroup induk untuk memberi ruang bagi jendela sistem. Langkah ini cukup untuk sebagian besar aplikasi.

Namun, pada beberapa kasus, Anda mungkin perlu memodifikasi padding default guna mendapatkan tata letak yang diinginkan untuk aplikasi Anda. Untuk memanipulasi langsung cara konten Anda tertata secara relatif terhadap kolom sistem (yang menempati ruang yang dikenal sebagai "inset konten" jendela), ganti fitSystemWindows(Rect insets). Metode fitSystemWindows() dipanggil oleh hierarki tampilan saat inset konten untuk jendela telah berubah, agar jendela dapat menyesuaikan kontennya. Dengan mengganti metode ini, Anda dapat menangani inset (dan tata letak aplikasi Anda) sesuai keinginan.