Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reliably get height of status bar to solve KitKat translucent navigation issue

I am experimenting with the new Android 4.4 translucent navigation bars and would like to set the navigation bar as translucent using the FLAG_TRANSLUCENT_NAVIGATION flag. I only wish the navigation bar (back, home button etc) to be translucent - I want the status bar at the top of the screen to appear normally I.e. NOT translucent.

The code I am using to achieve this is:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {     Window w = getWindow();     w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } 

The problem I have is Android now thinks the Activity is fullscreen and places the layout behind the navigation bar (which is correct), unfortunately it also places the layout behind the status bar (a problem).

A hacky fix for this would be to apply a padding to the top of the layout parent View, however I need to determine the height of the status bar to do this.

Could anyone suggest how I get the status bar height, it's not as trivial as I thought it would be, or alternatively suggest a proper solution.

Thanks

like image 999
Milo Avatar asked Dec 14 '13 14:12

Milo


People also ask

What is the height of status bar?

Official height is 24dp , as is stated officially by Google on Android Design webpage.

What is the height of the Android navigation bar?

The height of the bottom Navigation bar is 48dp (in both portrait and landscape mode) and is 42dp when the bar is placed vertically. That's even better.


2 Answers

public int getStatusBarHeight() {       int result = 0;       int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");       if (resourceId > 0) {           result = getResources().getDimensionPixelSize(resourceId);       }       return result; } 

Use the above code in the onCreate method. Put it in a contextWrapper class. http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/

like image 107
user2511882 Avatar answered Sep 28 '22 17:09

user2511882


Since api 21 there is official method for retrieving insets for status bar and navigation bar height when is translucent

ViewCompat.setOnApplyWindowInsetsListener(view, new OnApplyWindowInsetsListener() {         @Override         public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {             final int statusBar = insets.getSystemWindowInsetTop();             final int navigationBar = insets.getSystemWindowInsetBottom();             return insets;         }     }); 
like image 33
Jacek Marchwicki Avatar answered Sep 28 '22 15:09

Jacek Marchwicki