Android之解决全屏切换非全屏的页面压缩问题

Android从全屏页面(A)跳转到非全屏页面(B)会发现非全屏页面(B)的页面会闪动一下。这里的闪动高度是状态栏的高度,也就是B页面显示状态栏时页面的显示布局会向下拉伸状态栏的高度。从这可以看出底层的布局应该是采用相对布局实现的。

通常解决该问题的方法是在A页面结束前/后,设置非全屏,比如在A页面的UI线程中添加以下代码:

WindowManager.LayoutParams attr = getWindow().getAttributes();
				attr.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
				getWindow().setAttributes(attr);
				getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

然后进行startActivity跳转,你会发现A页面在进行跳转的刹那,页面会被压缩一下,然后跳转到B页面,这样虽然解决了B页面的压缩效果,但是没有从根本上解决问题,只是将压缩的效果从B页面转移到A页面了。

通过分析我们可以在B页面显示时采用状态栏占位的方式,代码如下:

    /**
     * 状态栏处理:解决全屏切换非全屏页面被压缩问题
     */
    public void initStatusBar(int barColor) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
            // 获取状态栏高度
            int statusBarHeight = getResources().getDimensionPixelSize(resourceId);
            View rectView = new View(this);
            // 绘制一个和状态栏一样高的矩形,并添加到视图中
            LinearLayout.LayoutParams params
                    = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight);
            rectView.setLayoutParams(params);
            //设置状态栏颜色
            rectView.setBackgroundColor(getResources().getColor(barColor));
            // 添加矩形View到布局中
            ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
            decorView.addView(rectView);
            ViewGroup rootView = (ViewGroup) ((ViewGroup) this.findViewById(android.R.id.content)).getChildAt(0);
            rootView.setFitsSystemWindows(true);
            rootView.setClipToPadding(true);
        }
    }


该方法在B页面的setContentView方法之后调用。

你可能感兴趣的:(Android)