android dialog 隱藏狀態列_隱藏狀態列
技術標籤:android dialog 隱藏狀態列android view的隱藏和顯示android 隱藏狀態列
本節課介紹如何在不同版本的 Android 上隱藏狀態列。隱藏狀態列(也可選擇隱藏導航欄)可為內容騰出更多顯示空間,從而提供更加身臨其境的使用者體驗。
圖 1 顯示了具有可見狀態列的應用:
圖 1.狀態列可見。
圖 2 顯示了狀態列已隱藏的應用。請注意,操作欄也會隱藏。您不應在沒有狀態列的情況下顯示操作欄。
圖 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()
方法,以允許視窗相應地調整其內容。通過替換此方法,您可以根據需要處理嵌入內容(以及應用佈局)。