Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

application content goes behind the navigation bar in android L

enter image description here

As you can see my "Got It" button is behind the navigation bar.Not able to fix it!!! I have tried

<item name="android:fitsSystemWindows">true</item>  

As well as setting it in layout file.

my theme in value-21 is :

 <style name="AppTheme" parent="android:Theme.Material.Light.NoActionBar">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowActionBar">false</item>
        <item name="android:windowFullscreen">false</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:fitsSystemWindows">true</item>
    </style>

Its the same case with all the screens throughout the application.

Please Help.

like image 448
nitesh goel Avatar asked Feb 03 '15 16:02

nitesh goel


People also ask

What is the Android navigation bar?

The Navigation bar is the menu that appears on the bottom of your screen - it's the foundation of navigating your phone. However, it isn't set in stone; you can customize the layout and button order, or even make it disappear entirely and use gestures to navigate your phone instead.

What is the use of navigation button in Android?

Gesture navigation: At the very bottom of the screen, swipe from left to right. 2-button navigation: To switch between your 2 most recent apps, swipe right on Home . 3-button navigation: Tap Overview . Swipe right until you find the app you want.

How do I hide apps on my navigation bar?

If you want to view files or use apps in full screen, double-tap the Show and hide button to hide the navigation bar.

What is back navigation in Android?

Back navigation is how users move backward through the history of screens they previously visited. All Android devices provide a Back button for this type of navigation, so you should not add a Back button to your app's UI.


3 Answers

It is so simple, just add this line to your parent layout xml:

android:fitsSystemWindows="true"
like image 42
Matin Ashtiani Avatar answered Oct 17 '22 01:10

Matin Ashtiani


Here is the solution.

Most of the layouts get solved by adding these properties in values-v21 style.xml

<item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:fitsSystemWindows">true</item>

for others, I have calculated the hight of navigation bar and add margin to my view .

public static int getSoftButtonsBarSizePort(Activity activity) {
    // getRealMetrics is only available with API 17 and +
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        DisplayMetrics metrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int usableHeight = metrics.heightPixels;
        activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
        int realHeight = metrics.heightPixels;
        if (realHeight > usableHeight)
            return realHeight - usableHeight;
        else
            return 0;
    }
    return 0;
}

Note: By using the above solutions everything work but I was also using PopupWindow in my app.The layout of the PopupWindow get messed up in android L. Look for the issue and the solution here

like image 77
nitesh goel Avatar answered Oct 17 '22 03:10

nitesh goel


For nice user experience you should not need to block navigation keys area using android:windowTranslucentNavigation

rather here is the better solution, if you are using ResideMenu library then simply add this method in ResideMenu.java

  @Override
protected boolean fitSystemWindows(Rect insets) {
    int bottomPadding = insets.bottom;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Resources resources = 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;
}

and if you are using SlidingMenu library then change mod to SLIDING_CONTENT by:

menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);

Hope it will save your time

like image 6
Muhammad Farhan Habib Avatar answered Oct 17 '22 02:10

Muhammad Farhan Habib