I'm trying to add the edge-to-edge stuff for the gesture navigation bar to the Tip Time app from Google. I added the transparent navigationBarColor
XML tag to themes.xml
as well as the following code to the onCreate()
function of MainActivity.kt
:
This was directly copy-pasted from the documentation. Android Studio says that "it cannot find a parameter with this name" for each of the three margins. I noticed that changing the parenthesis right after <ViewGroup.MarginLayoutParams>
to curly braces fixes the compiler error. Maybe the documentation is just wrong?
Anyways, even after fixing that, the app still doesn't look right:
As you can see, the entire view gets shifted up slightly and the "Cost of Service" TextView
is partially cut-off by the app bar. What would I need to change to implement the system/navigation bar insets for edge-to-edge content so the UI looks nice? Also, as a side-question, how can I change the dark blue color of the system status bar to match the color of the app bar so that they look blended?
As per documentation for edge to edge contents:
Draw behind the status bar if it makes sense for your content and layout, such as in the case of full-width imagery. To do this, use APIs such as AppBarLayout, which defines an app bar pinned to the top of the screen.
So, while handing the window insets (especially the top one), you can't use the default ActionBar
, instead you need to customize that with AppBarLayout
and ToolBar
, and to make it act as the ActionBar
, use setSupportActionBar()
, and a NoActionBar
app theme; it'd be <style name="Theme.TipTime" parent="Theme.MaterialComponents.DayNight.NoActionBar">
in the shared repo.
the entire view gets shifted up slightly and the "Cost of Service" text field is partially cut-off by the app bar.
The reason that the sample uses the default ActionBar
instead of a customized one; when it comes to handle the top window insets, it won't affect the default ActionBar
; notice that you pass in the activity's root layout to setOnApplyWindowInsetsListener
callback, and as the ActionBar
is not a part of the activity, it won't be affected. Therefore the activity is shifted up behind the ActionBar
when the top inset is removed. So, to solve this you have either to totally remove the default ActionBar
or to use a custom toolbar instead.
Also, as a side-question, how can I change the dark blue color of the system status bar to match the color of the app bar so that they look blended?
Use a transparent status bar color in the app's theme:
<item name="android:statusBarColor" tools:targetApi="l">@android:color/transparent</item>