Development
August 21, 2017
Tinted status bar in Android
From https://github.com/mapsme/omim/blob/master/android/src/com/mapswithme/util/UiUtils.java
Your UIUtils
or base activity class:
fun setupStatusBar(activity: Activity){ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { activity.window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) } else { activity.window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN } val statusBarTintView = View(activity).also { it.layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)).also { it.gravity = Gravity.TOP } it.setBackgroundColor(ResourcesCompat.getColor(activity.resources, R.color.statusBarTint, activity.theme)) it.visibility = View.VISIBLE } activity.window.decorView.let {it as ViewGroup}.addView(statusBarTintView) } fun getStatusBarHeight(context: Context): Int { var result = 0 val res = context.resources val resourceId = res.getIdentifier("status_bar_height", "dimen", "android") if (resourceId > 0) result = res.getDimensionPixelSize(resourceId) return result }
Your activity theme should have transparent status bar:
<style name="..."> <item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item> </style>
Your layout should not fit system windows:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="false" tools:context="com.nakedhearts.elbi.MainActivity"> </android.support.constraint.ConstraintLayout>
Your activity should apply styling in code:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) UIUtils.setupStatusBar(this) setContentView(R.layout.activity_main) }