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方法之后调用。