Status bar turns white and does not show content behind it
I fixed my issue by changing my Activity layout from FrameLayout to RelativeLayout. Thanks everybody who tried to help!
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent">
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/theme_primary_dark"
android:fitsSystemWindows="true" />
</RelativeLayout>
Try hierarchy-viewer or ViewInspector. These tools might help you.
Statusbar of new activities turns white when using transparent statusbar
I have now identified two solutions for achieving the desired behavior:
- Modifying window flags in the activity's
onCreate
method:
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
This will color the status bar grayish so that the system icons are visible again.
- Modifying the background color of the activities root layout to match the desired statusbar color:
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:background="@color/colorPrimaryDark">
<FrameLayout
android:id="@+id/search_fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
I was able to find the last solution thanks to a friendly comment from Phoenix Wang.
The status bar is white above toolbar
I found the answer here:
Status bar is white
<item name="android:statusBarColor">@android:color/transparent</item>
You'll see that line of code in values/styles/styles.xml(v21) . Remove it and that solves the issue
How can I make the status bar white with black icons?
With Android M (api level 23) you can achieve this from theme with android:windowLightStatusBar
attribute.
Edit :
Just as Pdroid mentioned, this can also be achieved programatically:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
Transparent status bar (with visible navigation bar)
Step 1: To make the status bar transparent: add the below into the style themes.xml
or sytles.xml
:
<item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
Step 2: Then in activity to make the status bar overlaps with the activity:
The used window flags are deprecated as of API level 30, so they can be used till API level 29:
if (Build.VERSION.SDK_INT in 21..29) {
window.statusBarColor = Color.TRANSPARENT
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.decorView.systemUiVisibility =
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or SYSTEM_UI_FLAG_LAYOUT_STABLE
} else if (Build.VERSION.SDK_INT >= 30) {
window.statusBarColor = Color.TRANSPARENT
// Making status bar overlaps with the activity
WindowCompat.setDecorFitsSystemWindows(window, false)
}
UPDATE For API-30
This doesn't actually make the status bar transparent, it makes it translucent and will still have a shadow to it
This is right on API-30, and reason because setting <item name="android:windowTranslucentStatus">true</item>
.
Actually the <item name="android:windowTranslucentStatus">true</item>
is only required on API level 19. If your app is greater than that, you can dismiss it at all.
Anyways, the way to fix this is to override the themes.xml/styles.xml in API-30; i.e. to have a res\values-v30\themes.xml
; you can just add the main app theme like:
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.TransparentStatusBar" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
</style>
</resources>
UPDATE 2 For API-30
Just discovered a bug on API 30 that the bottom navigation overlaps with the activity obscuring the bottom part of it, that probably couldn't be discovered by the OP as they are using a map.
To solve this, As per documentation:
You can address overlaps by reacting to insets, which specify which
parts of the screen intersect with system UI such as the navigation
bar or the status bar. Intersecting can mean simply being displayed
above the content, but it can also inform your app about system
gestures, too.
So, we need to handle the System bars insets for API level 30+ to avoid your app overlapping with the navigation bar:
This requires the top root ViewGroup
of the activity layout, and accordingly the LayoutParams
need to be coasted appropriately.
Here I am using a ConstraintLayout
as a root layout, and FrameLayout.LayoutParams
:
/*
* Making the Navigation system bar not overlapping with the activity
*/
if (Build.VERSION.SDK_INT >= 30) {
// Root ViewGroup of my activity
val root = findViewById<ConstraintLayout>(R.id.root)
ViewCompat.setOnApplyWindowInsetsListener(root) { view, windowInsets ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
// Apply the insets as a margin to the view. Here the system is setting
// only the bottom, left, and right dimensions, but apply whichever insets are
// appropriate to your layout. You can also update the view padding
// if that's more appropriate.
view.layoutParams = (view.layoutParams as FrameLayout.LayoutParams).apply {
leftMargin = insets.left
bottomMargin = insets.bottom
rightMargin = insets.right
}
// Return CONSUMED if you don't want want the window insets to keep being
// passed down to descendant views.
WindowInsetsCompat.CONSUMED
}
}
This is tested on 8 devices/emulators on the range of API level 19 to API level 30.
I want to change the status bar to other white but dark i want to change to black
Create new resource directory named values-night
, copy your themes.xml
to that directory and change the color to black there.
Related Topics
How to Change the Generated Filename for App Bundles with Gradle
Google Map Android API V2 Can't Display Map in Play Store Application
How to Test Boot_Completed Broadcast Receiver in Emulator
Android Sax Parser Not Getting Full Text from Between Tags
Upload an Image Using Google Volley
Add Dynamic Text Over Android Seekbar Thumb
Getallcellinfo Returns Null in Android 4.2.1
How to Delete from Firebase Realtime Database
Get the Co-Ordinates of a Touch Event on Android
How to Rotate Textview 90 Degrees and Display
Setting Android Theme Background Color
Android: Drawing Custom Shapes
Practical Way to Find Out If Sms Has Been Sent
Mediaplayer Setdatasource, Better to Use Path or Filedescriptor