編寫: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)欄的界面
http://wiki.jikexueyuan.com/project/android-training-geek/images/status_bar_show.png" alt="status_bar_show" />
圖1. 顯示狀態(tài)欄.
圖2展示了隱藏狀態(tài)欄的界面。請(qǐng)注意,Action Bar這個(gè)時(shí)候也被隱藏了。請(qǐng)永遠(yuǎn)不要在隱藏狀態(tài)欄的時(shí)候顯示Action Bar。
http://wiki.jikexueyuan.com/project/android-training-geek/images/status_bar_hide.png" alt="status_bar_hide" />
圖2. 隱藏狀態(tài)欄.
在Android 4.0及更低的版本中,你可以通過(guò)設(shè)置WindowManager來(lái)隱藏狀態(tài)欄。你可以動(dòng)態(tài)的隱藏,也可以在你的manifest文件中設(shè)置Activity的主題。如果你的應(yīng)用的狀態(tài)欄在運(yùn)行過(guò)程中會(huì)一直隱藏,那么推薦你使用改寫manifest設(shè)定主題的方法(嚴(yán)格上來(lái)講,即便設(shè)置了manifest你也可以動(dòng)態(tài)的改變界面主題)。
<application
...
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
...
</application>
設(shè)置主題的優(yōu)勢(shì)是:
另一方面我們可以選擇使用WindowManager來(lái)動(dòng)態(tài)隱藏狀態(tài)欄。這個(gè)方法可以更簡(jiǎn)單的在用戶與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)簽之后(無(wú)論是通過(guò)Activity主題還是動(dòng)態(tài)設(shè)置),這個(gè)標(biāo)簽都會(huì)一直生效直到你清除它。
設(shè)置了FLAG_LAYOUT_IN_SCREEN之后,你可以擁有與啟用FLAG_FULLSCREEN后相同的屏幕區(qū)域。這個(gè)方法防止了狀態(tài)欄隱藏和展示的時(shí)候內(nèi)容區(qū)域的大小變化。
在Android 4.1(API level 16)以及更高的版本中,你可以使用setSystemUiVisibility()來(lái)進(jìn)行動(dòng)態(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ū)域的大小就不會(huì)發(fā)生變化。要做到這個(gè)效果,我們需要用到SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN這個(gè)標(biāo)志。同時(shí),你也有可能需要SYSTEM_UI_FLAG_LAYOUT_STABLE這個(gè)標(biāo)志來(lái)幫助你的應(yīng)用維持一個(gè)穩(wěn)定的布局。
當(dāng)使用這種方法的時(shí)候,你就需要來(lái)確保應(yīng)用中特定區(qū)域不會(huì)被系統(tǒng)欄掩蓋(比如地圖應(yīng)用中一些自帶的操作區(qū)域)。如果被覆蓋了,應(yīng)用可能就會(huì)無(wú)法使用。在大多數(shù)的情況下,你可以在布局文件中添加android:fitsSystemWindows標(biāo)簽,設(shè)置它為true。它會(huì)調(diào)整父ViewGroup使它留出特定區(qū)域給系統(tǒng)欄,對(duì)于大多數(shù)應(yīng)用這種方法就足夠了。
在一些情況下,你可能需要修改默認(rèn)的padding大小來(lái)獲取合適的布局。為了控制內(nèi)容區(qū)域的布局相對(duì)系統(tǒng)欄(它占據(jù)了一個(gè)叫做“內(nèi)容嵌入”content insets的區(qū)域)的位置,你可以重寫fitSystemWindows(Rect insets)方法。當(dāng)窗口的內(nèi)容嵌入?yún)^(qū)域發(fā)生變化時(shí),fitSystemWindows()方法會(huì)被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)會(huì)在布局的上方繪制Aciton Bar。雖然這會(huì)遮蓋住上方的一些布局,但是當(dāng)Action Bar顯示或者隱藏的時(shí)候,系統(tǒng)就不需要重新改變布局區(qū)域的大小,使之無(wú)縫的變化。
要啟用Action Bar的overlay模式,你需要?jiǎng)?chuàng)建一個(gè)繼承自Action Bar主題的自定義主題,將android:windowActionBarOverlay屬性設(shè)置為true。要了解詳細(xì)信息,請(qǐng)參考添加Action Bar課程中的Action Bar的覆蓋層疊。
設(shè)置SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN來(lái)讓你的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è)動(dòng)畫來(lái)讓他們相互協(xié)調(diào)。