SYSTEM_UI_FLAG_LIGHT_STATUS_BAR and FLAG_TRANSLUCENT_STATUS is deprecated

Viewed 4718

This code is deprecated in API 30. Any idea how to update this?

private fun setSystemBarLight(act: Activity) {
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
           val view: View = act.findViewById(android.R.id.content)
           var flags: Int = view.systemUiVisibility
           flags = flags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
           view.systemUiVisibility = flags
      }
}

FLAG_TRANSLUCENT_STATUS is also deprecated here. I need help fixing this warning.

    private fun setSystemBarColor(act: Activity, color: String?) {
                val window: Window = act.window
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
                window.statusBarColor = Color.parseColor(color)
            }
3 Answers

These solutions only work on API >= 23.

UPDATE:

As suggested in the comment section, you can use WindowInsetsControllerCompat as follows.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    Window window = getWindow();
    View decorView = window.getDecorView();

    WindowInsetsControllerCompat wic = new WindowInsetsControllerCompat(window, decorView);

    wic.setAppearanceLightStatusBars(true); // true or false as desired.

    // And then you can set any background color to the status bar.
    window.setStatusBarColor(Color.WHITE);
}

OLD ANSWER:

In API level 30 setSystemUiVisibility() has been deprecated. Hence you should use WindowInsetsController. The below code will make the status bar light, that means the text in the statut bar will be black.

Window window = getWindow();
View decorView = window.getDecorView();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    WindowInsetsController wic = decorView.getWindowInsetsController();
    wic.setSystemBarsAppearance(APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}

// set any light background color to the status bar. e.g. - white or light blue
window.setStatusBarColor(Color.WHITE);

to clear this, use

wic.setSystemBarsAppearance(0, APPEARANCE_LIGHT_STATUS_BARS);

Yes now since it is deprecated, you can use:

window.setDecorFitsSystemWindows(false)

Then make sure you make the status bar transparent as well by adding below style to your app theme

<item name="android:navigationBarColor">@android:color/transparent</item>
    WindowCompat.setDecorFitsSystemWindows(window, false)
    val wic = WindowCompat.getInsetsController(window, window.decorView)
    wic?.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE
    wic?.isAppearanceLightStatusBars = true
    window.statusBarColor = Color.TRANSPARENT
Related