1. 程式人生 > 其它 >android dialog 隱藏狀態列_隱藏狀態列

android dialog 隱藏狀態列_隱藏狀態列

技術標籤:android dialog 隱藏狀態列android view的隱藏和顯示android 隱藏狀態列

本節課介紹如何在不同版本的 Android 上隱藏狀態列。隱藏狀態列(也可選擇隱藏導航欄)可為內容騰出更多顯示空間,從而提供更加身臨其境的使用者體驗。

圖 1 顯示了具有可見狀態列的應用:

640?wx_fmt=png

圖 1.狀態列可見。

圖 2 顯示了狀態列已隱藏的應用。請注意,操作欄也會隱藏。您不應在沒有狀態列的情況下顯示操作欄。

640?wx_fmt=png

圖 2.狀態列隱藏。

在 Android 4.0 及更低版本中隱藏狀態列

您可以通過設定WindowManager標記在 Android 4.0(API 級別 14)及更低版本中隱藏狀態列。您可以通過程式設計方式執行此操作,也可以在應用的清單檔案中設定 Activity 主題背景。如果應用中的狀態列應始終保持隱藏,則首選的方法是在應用的清單檔案中設定 Activity 主題背景(雖然嚴格來說,在需要時可以通過程式設計方式替換主題背景)。例如:

    <application        ...        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >        ...    application>    

使用 Activity 主題背景的優勢如下:

  • 與通過程式設計方式設定標誌相比,更易於維護且不易出錯。

  • 使介面轉換更加流暢,因為系統在例項化應用的主 Activity 之前已經擁有了渲染介面所需的資訊。

或者,您可以通過程式設計方式設定WindowManager標誌。這種方法更便於在使用者與您的應用互動時隱藏和顯示狀態列:

JAVA

    public class MainActivity extends Activity {        @Override        protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            // If the Android version is lower than Jellybean, use this call to hide            // the status bar.            if (Build.VERSION.SDK_INT < 16) {                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                        WindowManager.LayoutParams.FLAG_FULLSCREEN);            }            setContentView(R.layout.activity_main);        }        ...    }    

KOTLIN

    class MainActivity : Activity() {        override fun onCreate(savedInstanceState: Bundle?) {            super.onCreate(savedInstanceState)            // If the Android version is lower than Jellybean, use this call to hide            // the status bar.            if (Build.VERSION.SDK_INT < 16) {                window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                        WindowManager.LayoutParams.FLAG_FULLSCREEN)            }            setContentView(R.layout.activity_main)        }        ...    }    

當您設定WindowManager標誌時(無論是通過 Activity 主題背景還是通過程式設計方式),這些標誌將保持有效,直到應用將它們清除為止。

您可以使用FLAG_LAYOUT_IN_SCREEN設定 Activity 佈局,使其可用的螢幕區域與啟用了FLAG_FULLSCREEN時一樣。這可以在狀態列隱藏和顯示時防止您的內容大小發生調整。

在 Android 4.1 及更高版本中隱藏狀態列

您可以使用setSystemUiVisibility()在 Android 4.1(API 級別 16)及更高版本中隱藏狀態列。setSystemUiVisibility()在單個檢視級別設定介面標記;這些設定會聚合到視窗級別。與使用WindowManager標記相比,使用setSystemUiVisibility()設定介面標記讓您可以更精細地控制系統欄。以下程式碼段會隱藏狀態列:

JAVA

    View decorView = getWindow().getDecorView();    // Hide the status bar.    int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;    decorView.setSystemUiVisibility(uiOptions);    // Remember that you should never show the action bar if the    // status bar is hidden, so hide that too if necessary.    ActionBar actionBar = getActionBar();    actionBar.hide();    

KOTLIN

    // Hide the status bar.    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN    // Remember that you should never show the action bar if the    // status bar is hidden, so hide that too if necessary.    actionBar?.hide()    

請注意以下幾點:

  • 介面標誌被清除後(例如,離開 Activity),如果您希望再次隱藏這些欄,應用需要重置這些標誌。請參閱響應介面可見性更改,其中探討了如何監聽介面可見性更改,以便您的應用相應地做出響應。

  • 在不同的位置設定介面標記會產生不同的效果。如果您在 Activity 的onCreate()方法中隱藏系統欄,那麼當用戶按主螢幕按鈕時,系統欄會重新出現。當用戶重新開啟 Activity 後,系統不會呼叫onCreate(),因此係統欄仍保持可見。如果您希望在使用者進入和退出 Activity 時繼續保留系統介面更改,請在onResume()onWindowFocusChanged()中設定介面標記。

  • 要使方法setSystemUiVisibility()生效,您呼叫它時所在的檢視必須可見。

  • 離開該檢視會導致系統清除使用setSystemUiVisibility()設定的標誌。

讓內容顯示在狀態列後面

在 Android 4.1 及更高版本中,您可以將應用的內容設定為顯示在狀態列的後面,這樣內容大小就不會隨著狀態列的隱藏和顯示發生調整。可使用SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN執行此操作。您可能還需要使用SYSTEM_UI_FLAG_LAYOUT_STABLE來幫助您的應用保持穩定佈局。

當您使用此方法時,您要確保應用介面中的關鍵部分(例如,地圖應用中的內建控制元件)不會被系統欄覆蓋,否則會導致您的應用無法使用。在大多數情況下,要處理這個問題,您可以通過向 XML 佈局檔案新增android:fitsSystemWindows屬性並設定為true。這會調整父級ViewGroup的內邊距,為系統視窗留出空間。這對於大多數應用來說已經足夠。

不過,在某些情況下,您可能需要修改預設的內邊距以獲得應用所需的佈局。要直接操控內容相對於系統欄的佈局位置(佔據的空間稱為視窗的“內容嵌入”),請替換fitSystemWindows(Rect insets)。當視窗的內容嵌入發生更改時,檢視層次結構會呼叫fitSystemWindows()方法,以允許視窗相應地調整其內容。通過替換此方法,您可以根據需要處理嵌入內容(以及應用佈局)。