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

發佈了44 篇原創文章 · 獲贊 37 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章