Menyembunyikan status bar

Pelajaran ini menjelaskan cara menyembunyikan {i>status bar<i} pada berbagai versi Android. Menyembunyikan bilah status (dan jika perlu, bilah 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 WindowManager. Anda dapat melakukannya secara terprogram atau dengan mengatur tema aktivitas dalam file manifes aplikasi Anda. Menetapkan tema aktivitas di tema aplikasi {i>Manifest file <i}adalah pendekatan yang lebih disukai jika {i>status bar<i} harus selalu tersembunyi di aplikasi Anda (walaupun sebenarnya, Anda bisa mengganti secara terprogram tema jika Anda mau). 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.
  • Ini menghasilkan transisi UI yang lebih halus, karena sistem memiliki informasi yang diperlukan untuk merender UI Anda sebelum membuat instance aktivitas utama aplikasi.

Atau, Anda dapat menetapkan tanda WindowManager secara terprogram. Pendekatan ini memudahkan penyembunyian dan tampilan status bar saat pengguna berinteraksi 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), flag tetap berlaku kecuali aplikasi Anda menghapusnya.

Anda dapat menggunakan FLAG_LAYOUT_IN_SCREEN untuk menyetel tata letak aktivitas agar menggunakan area layar sama dengan yang tersedia saat Anda mengaktifkan FLAG_FULLSCREEN. Hal ini mencegah konten agar tidak diubah ukurannya 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 tinggi dengan menggunakan setSystemUiVisibility(). setSystemUiVisibility() menetapkan tanda UI pada tingkat tampilan individual; setelan ini digabungkan ke tingkat jendela. Menggunakan setSystemUiVisibility() untuk menetapkan tanda UI memberi Anda kontrol yang lebih terperinci atas bilah sistem dibandingkan menggunakan 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 mengatur ulang mereka jika Anda ingin menyembunyikan bilah lagi. Lihat Merespons Perubahan Visibilitas UI untuk diskusi tentang cara memproses perubahan visibilitas UI sehingga aplikasi Anda dapat merespons hal tersebut.
  • Tempat Anda menetapkan tanda UI akan membuat perbedaan. Jika Anda menyembunyikan bilah sistem di kolom aktivitas onCreate() dan pengguna menekan Home, kolom sistem akan muncul kembali. Saat pengguna membuka kembali aktivitas, onCreate() tidak akan dipanggil, jadi bilah sistem akan tetap terlihat. Jika Anda ingin perubahan UI sistem tetap ada saat pengguna masuk dan keluar dari aktivitas Anda, setel flag UI di onResume() atau onWindowFocusChanged().
  • Metode setSystemUiVisibility() hanya berpengaruh jika tampilan yang Anda gunakan untuk memanggilnya terlihat.
  • Keluar dari tampilan menyebabkan flag ditetapkan dengan setSystemUiVisibility() dihapus.

Memunculkan Konten Di Belakang Status Bar

Pada Android 4.1 dan yang lebih tinggi, Anda dapat menyetel konten aplikasi Anda agar muncul di belakang {i>status bar<i}, sehingga konten tidak berubah ukuran saat {i>status bar<i} 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 mempertahankan dan tata letak yang stabil.

Ketika Anda menggunakan pendekatan ini, Anda bertanggung jawab untuk memastikan bahwa bagian penting UI aplikasi Anda (misalnya, kontrol bawaan dalam aplikasi Maps) tidak ditutupi oleh bilah sistem. Hal ini dapat membuat aplikasi Anda tidak dapat digunakan. Dalam kebanyakan kasus, Anda dapat tangani ini dengan menambahkan atribut android:fitsSystemWindows ke file tata letak XML, setel ke true. Ini menyesuaikan padding dari ViewGroup induk untuk menyisakan ruang untuk jendela sistem. Langkah ini cukup untuk sebagian besar aplikasi.

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