How do I get the height and width of the Android Navigation Bar programmatically?
Try below code:
Resources resources = context.getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
return resources.getDimensionPixelSize(resourceId);
}
return 0;
How to REALLY get the navigation bar height in Android
This is the code I use to get the navigation bar size. Its height will be in Point.y
Credit to this answer
public static Point getNavigationBarSize(Context context) {
Point appUsableSize = getAppUsableScreenSize(context);
Point realScreenSize = getRealScreenSize(context);
// navigation bar on the right
if (appUsableSize.x < realScreenSize.x) {
return new Point(realScreenSize.x - appUsableSize.x, appUsableSize.y);
}
// navigation bar at the bottom
if (appUsableSize.y < realScreenSize.y) {
return new Point(appUsableSize.x, realScreenSize.y - appUsableSize.y);
}
// navigation bar is not present
return new Point();
}
public static Point getAppUsableScreenSize(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
return size;
}
public static Point getRealScreenSize(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
Point size = new Point();
if (Build.VERSION.SDK_INT >= 17) {
display.getRealSize(size);
} else if (Build.VERSION.SDK_INT >= 14) {
try {
size.x = (Integer) Display.class.getMethod("getRawWidth").invoke(display);
size.y = (Integer) Display.class.getMethod("getRawHeight").invoke(display);
} catch (IllegalAccessException e) {} catch (InvocationTargetException e) {} catch (NoSuchMethodException e) {}
}
return size;
}
Edit: To answer your question I had to use this function since I wanted to add ResideMenu to my app, but ended getting a weird empty margin at the bottom of my app, because of the navigation bar.
So I edited this function added by ResideMenu like this:
@Override
protected boolean fitSystemWindows(Rect insets) {
// Applies the content insets to the view's padding, consuming that content (modifying the insets to be 0),
// and returning true. This behavior is off by default and can be enabled through setFitsSystemWindows(boolean)
// in API14+ devices.
int bottomPadding = insets.bottom;
Point p = getNavigationBarSize(getContext());
if (Build.VERSION.SDK_INT >= 21 && p.x != 0) {
Resources resources = getContext().getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
bottomPadding += resources.getDimensionPixelSize(resourceId);
}
}
this.setPadding(viewActivity.getPaddingLeft() + insets.left, viewActivity.getPaddingTop() + insets.top,
viewActivity.getPaddingRight() + insets.right, viewActivity.getPaddingBottom() + bottomPadding);
insets.left = insets.top = insets.right = insets.bottom = 0;
return true;
}
Hope that will help you.
How do I get the height and width of the Android Navigation Bar programmatically in flutter?
Use this to get the bottom nav bar height
MediaQuery.of(context).viewInsets.bottom
How do I get the bottom navigation bar height for Material Design 3?
With Material3 the BottomNavigationView
has a different minHeight
.
You can apply something like:
<fragment
android:layout_marginBottom="@dimen/m3_bottom_nav_min_height"
Reference: android/material/bottomnavigation/res/values/dimens.xml#L32
Navigation Bar in Android: size and position
Posting here for benefit of those who end up here looking for ways to elegantly handle Navigationbar and Statusbar.
Refer this post.
As suggested in many of similar questions, for example this, this, this, and this, simply getting navigation bar height may not be enough. We need to consider whether 1. navigation bar exists, 2. is it on the bottom, or right or left, 3. is app open in multi-window mode.
There is a simple one line solution
android:fitsSystemWindows="true"
or programatically
findViewById(R.id.your_root_view).setFitsSystemWindows(true);
you may also get root view by
findViewById(android.R.id.content).getRootView();
or
getWindow().getDecorView().findViewById(android.R.id.content)
For more details on getting root-view refer - https://stackoverflow.com/a/4488149/9640177
Android navigation bar size in xml
After looking in android source it looks like there is dimens for navigation bar height :
@android:dimen/navigation_bar_height
There are other dimens linked to nav bar, examples from android values/dimens.xml :
<!-- Height of the bottom navigation / system bar. -->
<dimen name="navigation_bar_height">48dp</dimen>
<!-- Height of the bottom navigation bar in portrait; often the same as @dimen/navigation_bar_height -->
<dimen name="navigation_bar_height_landscape">48dp</dimen>
<!-- Width of the navigation bar when it is placed vertically on the screen -->
<dimen name="navigation_bar_width">42dp</dimen>
Related Topics
Nullpointerexception:Println Needs a Message in Android
How to Change Android Minsdkversion in Flutter Project
Strange Behavior with Android Orientation Sensor
How to Pass the Values from One Activity to Previous Activity
Android - Java.Lang.Securityexception: Permission Denial: Starting Intent
How to Startforeground() Without Showing Notification
Record/Save Audio from Voice Recognition Intent
Grid of Images Inside Scrollview
How to Save Sms to Inbox in Android
How to Get the Current Location Latitude and Longitude in Android
Too Many Field References: 70613; Max Is 65536
How to Implement Multi-Select in Recyclerview
Error Opening Trace File: No Such File or Directory (2)