Search code examples
androidnavigation-drawerstatusbar

DrawerLayout artifact after disable translucent status bar


First enable translucent status bar

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);       
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);  

after need dynamically disable it

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);  

After disabling displayed strange artifact(translucent line), like on pic

enter image description here

UPD example project on github


Solution

  • After research I found solution and write custom class

    public class DrawableLayoutFullScreen extends DrawerLayout {
    
        public DrawableLayoutFullScreen(Context context) {
            this(context,null);
        }
    
        public DrawableLayoutFullScreen(Context context, AttributeSet attrs) {
            super(context, attrs);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                setOnApplyWindowInsetsListener((v, insets) -> {
                    final DrawableLayoutFullScreen drawerLayout = (DrawableLayoutFullScreen) v;
                    drawerLayout.setWillNotDraw(insets.getSystemWindowInsetTop() <= 0 && getBackground() == null);
                    drawerLayout.requestLayout();
                    return insets.consumeSystemWindowInsets();
                });
            }
        }
    
        @Override
        public void setFitsSystemWindows(boolean fitSystemWindows) {
            if (fitSystemWindows) {
                setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            } else {
                setSystemUiVisibility(0);
            }
            super.setFitsSystemWindows(fitSystemWindows);
        }
    }
    

    When call setFitsSystemWindows(true) DrawableLayoutFullScreen fill window and will draw above status bar. After that need setup padding and margins for child views