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方法之後調用。