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 menyetel tanda WindowManager. Anda dapat melakukannya secara terprogram atau dengan menyetel tema aktivitas di file manifes aplikasi Anda. Menetapkan tema aktivitas dalam file manifes aplikasi adalah pendekatan yang lebih disukai jika status bar harus selalu tersembunyi di aplikasi Anda (meskipun sebenarnya, Anda dapat mengganti tema secara terprogram jika menginginkannya). 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.
  • Hal ini menghasilkan transisi UI yang lebih lancar karena sistem memiliki informasi yang diperlukan untuk merender UI sebelum membuat instance aktivitas utama aplikasi.

Atau, Anda dapat menetapkan tanda WindowManager secara terprogram. Pendekatan ini mempermudah 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 menyetel tata letak aktivitas agar dapat menggunakan area layar yang sama dengan yang tersedia saat Anda mengaktifkan FLAG_FULLSCREEN. Hal ini mencegah konten Anda mengubah ukuran saat status bar disembunyikan dan ditampilkan.

Menyembunyikan 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 baru menggunakan setSystemUiVisibility(). setSystemUiVisibility() menetapkan tanda UI di tingkat tampilan individual; setelan ini digabungkan ke tingkat jendela. Menggunakan setSystemUiVisibility() untuk menetapkan tanda UI memberi Anda kontrol yang lebih terperinci pada kolom sistem daripada 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 Anda perlu meresetnya jika Anda ingin menyembunyikan bar lagi. Lihat Merespons Perubahan Visibilitas UI untuk diskusi tentang cara memproses perubahan visibilitas UI sehingga aplikasi Anda dapat merespons.
  • Tempat Anda menetapkan tanda UI akan membuat perbedaan. Jika Anda menyembunyikan kolom sistem dalam metode onCreate() aktivitas dan pengguna menekan Beranda, kolom sistem akan muncul kembali. Saat pengguna membuka kembali aktivitas, onCreate() tidak akan dipanggil, sehingga kolom sistem akan tetap terlihat. Jika Anda ingin perubahan UI sistem bertahan saat pengguna masuk dan keluar dari aktivitas, tetapkan flag UI di onResume() atau onWindowFocusChanged().
  • Metode setSystemUiVisibility() hanya berpengaruh jika tampilan yang Anda panggil terlihat.
  • Keluar dari tampilan menyebabkan flag yang ditetapkan dengan setSystemUiVisibility() 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 mengubah 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 mempertahankan tata letak yang stabil.

Saat 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 umumnya, Anda dapat menangani hal ini dengan menambahkan atribut android:fitsSystemWindows ke file tata letak XML, yang ditetapkan ke true. Ini menyesuaikan padding dari ViewGroup induk untuk memberikan ruang bagi jendela sistem. Langkah ini cukup untuk sebagian besar aplikasi.

Namun, dalam beberapa kasus, Anda mungkin perlu mengubah padding default guna mendapatkan tata letak yang diinginkan untuk aplikasi Anda. Untuk memanipulasi langsung cara tata letak konten Anda 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.