W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
編寫:K0ST - 原文:http://developer.android.com/training/system-ui/status.html
這節(jié)課將教您
同時(shí)您應(yīng)該閱讀
本課程將教您如何在不同版本的Android下隱藏狀態(tài)欄。隱藏狀態(tài)欄(或者是導(dǎo)航欄)可以讓內(nèi)容得到更多的展示空間,從而提供一個(gè)更加沉浸式的用戶體驗(yàn)。
圖1展示了顯示狀態(tài)欄的界面
圖1. 顯示狀態(tài)欄.
圖2展示了隱藏狀態(tài)欄的界面。請注意,Action Bar這個(gè)時(shí)候也被隱藏了。請永遠(yuǎn)不要在隱藏狀態(tài)欄的時(shí)候顯示Action Bar。
圖2. 隱藏狀態(tài)欄.
在Android 4.0及更低的版本中,你可以通過設(shè)置WindowManager
來隱藏狀態(tài)欄。你可以動態(tài)的隱藏,也可以在你的manifest文件中設(shè)置Activity的主題。如果你的應(yīng)用的狀態(tài)欄在運(yùn)行過程中會一直隱藏,那么推薦你使用改寫manifest設(shè)定主題的方法(嚴(yán)格上來講,即便設(shè)置了manifest你也可以動態(tài)的改變界面主題)。
<application
...
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
...
</application>
設(shè)置主題的優(yōu)勢是:
另一方面我們可以選擇使用WindowManager
來動態(tài)隱藏狀態(tài)欄。這個(gè)方法可以更簡單的在用戶與App進(jìn)行交互式展示與隱藏狀態(tài)欄。
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);
}
...
}
當(dāng)你設(shè)置WindowManager
標(biāo)簽之后(無論是通過Activity主題還是動態(tài)設(shè)置),這個(gè)標(biāo)簽都會一直生效直到你清除它。
設(shè)置了FLAG_LAYOUT_IN_SCREEN
之后,你可以擁有與啟用FLAG_FULLSCREEN
后相同的屏幕區(qū)域。這個(gè)方法防止了狀態(tài)欄隱藏和展示的時(shí)候內(nèi)容區(qū)域的大小變化。
在Android 4.1(API level 16)以及更高的版本中,你可以使用setSystemUiVisibility())來進(jìn)行動態(tài)隱藏。setSystemUiVisibility()
在View層面設(shè)置了UI的標(biāo)簽,然后這些設(shè)置被整合到了Window層面。setSystemUiVisibility()
給了你一個(gè)比設(shè)置WindowManager
標(biāo)簽更加粒度化的操作。下面這段代碼隱藏了狀態(tài)欄:
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();
注意以下幾點(diǎn):
在Android 4.1及以上版本,你可以將應(yīng)用的內(nèi)容顯示在狀態(tài)欄之后,這樣當(dāng)狀態(tài)欄顯示與隱藏的時(shí)候,內(nèi)容區(qū)域的大小就不會發(fā)生變化。要做到這個(gè)效果,我們需要用到SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
這個(gè)標(biāo)志。同時(shí),你也有可能需要SYSTEM_UI_FLAG_LAYOUT_STABLE
這個(gè)標(biāo)志來幫助你的應(yīng)用維持一個(gè)穩(wěn)定的布局。
當(dāng)使用這種方法的時(shí)候,你就需要來確保應(yīng)用中特定區(qū)域不會被系統(tǒng)欄掩蓋(比如地圖應(yīng)用中一些自帶的操作區(qū)域)。如果被覆蓋了,應(yīng)用可能就會無法使用。在大多數(shù)的情況下,你可以在布局文件中添加android:fitsSystemWindows
標(biāo)簽,設(shè)置它為true。它會調(diào)整父ViewGroup使它留出特定區(qū)域給系統(tǒng)欄,對于大多數(shù)應(yīng)用這種方法就足夠了。
在一些情況下,你可能需要修改默認(rèn)的padding大小來獲取合適的布局。為了控制內(nèi)容區(qū)域的布局相對系統(tǒng)欄(它占據(jù)了一個(gè)叫做“內(nèi)容嵌入”content insets
的區(qū)域)的位置,你可以重寫fitSystemWindows(Rect insets)
方法。當(dāng)窗口的內(nèi)容嵌入?yún)^(qū)域發(fā)生變化時(shí),fitSystemWindows()
方法會被view的hierarchy調(diào)用,讓View做出相應(yīng)的調(diào)整適應(yīng)。重寫這個(gè)方法你就可以按你的意愿處理嵌入?yún)^(qū)域與應(yīng)用的布局。
在Android 4.1及以上的版本,為了防止在Action Bar隱藏和顯示的時(shí)候布局發(fā)生變化,你可以使用Action Bar的overlay模式。在Overlay模式中,Activity的布局占據(jù)了所有可能的空間,好像Action Bar不存在一樣,系統(tǒng)會在布局的上方繪制Aciton Bar。雖然這會遮蓋住上方的一些布局,但是當(dāng)Action Bar顯示或者隱藏的時(shí)候,系統(tǒng)就不需要重新改變布局區(qū)域的大小,使之無縫的變化。
要啟用Action Bar的overlay模式,你需要?jiǎng)?chuàng)建一個(gè)繼承自Action Bar主題的自定義主題,將android:windowActionBarOverlay
屬性設(shè)置為true。要了解詳細(xì)信息,請參考添加Action Bar課程中的Action Bar的覆蓋層疊。
設(shè)置SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
來讓你的activity使用的屏幕區(qū)域與設(shè)置SYSTEM_UI_FLAG_FULLSCREEN
時(shí)的區(qū)域相同。當(dāng)你需要隱藏系統(tǒng)UI時(shí),使用SYSTEM_UI_FLAG_FULLSCREEN
。這個(gè)操作也同時(shí)隱藏了Action Bar(因?yàn)?code>windowActionBarOverlay="true"),當(dāng)同時(shí)顯示與隱藏ActionBar與狀態(tài)欄的時(shí)候,使用一個(gè)動畫來讓他們相互協(xié)調(diào)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: