1. 程式人生 > >Android 全屏介面切換到非全屏介面的問題

Android 全屏介面切換到非全屏介面的問題

App一般都有一個啟動介面,稱為Splash介面。

一般這個介面都是做成全屏的,即隱藏掉系統狀態列,然後再跳轉到主介面。

由於主介面是非全屏的,保留著狀態列,這個過程就發生了從全屏介面切換到非全屏介面。

但是在頁面切換過程中,會出現先顯示頁面內容,然後由於狀態列的出現,整個介面下移一個狀態列高度的問題。
如下圖所示:
before

當前的網易新聞客戶端在5.0的裝置上也會出現這樣的情況,如下圖所示:
neteasy
可以看到很明顯的介面下移,特別是這種加了介面滑動切換動畫的。

解決方法:
Google之後,找到下面這個連結:
Switching from Full Screen to Non Full Screen Smoothly in Android


然而當在切換之後的activity是繼承自AppCompatActivity 或者 ActionBarActivity時是有bug的,ActionBar會上移到狀態列,後來研究了一下,給出我自己的解決方案。
主要的程式碼如下:

private void smoothSwitchScreen() {
        // 5.0以上修復了此bug
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            ViewGroup rootView = ((ViewGroup) this.findViewById(android.R.id.content));
            int
resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); int statusBarHeight = getResources().getDimensionPixelSize(resourceId); rootView.setPadding(0, statusBarHeight, 0, 0); getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); } }

程式碼不多,也很好理解,先獲取到狀態列的高度,然後設定根佈局的padding,再設定視窗FLAG_LAYOUT_IN_SCREENFLAG_LAYOUT_NO_LIMITS屬性。

該方法在切換之後的那個activity的setContentView() 方法之前呼叫,就可以解決全屏切換到非全屏的問題。(必須在此之前)

處理後的效果如下所示:
after

該程式的程式碼我上傳在github上,可以前去下載檢視。
演示demo Github傳送門