天天看點

筆記53 | 管理系統UI(一)隐藏狀态欄隐藏導航欄我的Android征途

淡化狀态欄和系統欄

如果要淡化狀态和通知欄,在版本為4.0以上的Android系統上,你可以像如下使用

SYSTEM_UI_FLAG_LOW_PROFILE

這個标簽。

// This example uses decor view, but you can use any visible view.
View decorView = getActivity().getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_LOW_PROFILE;
decorView.setSystemUiVisibility(uiOptions);
           

一旦使用者觸摸到了狀态欄或者是系統欄,這個标簽就會被清除,使系統欄重新顯現(無透明度)。在标簽被清除的情況下,如果你想重新淡化系統欄就必須重新設定這個标簽。

圖1展示了一個圖庫中的圖檔,界面的系統欄都已被淡化(需要注意的是圖庫應用完全隐藏狀态欄,而不是淡化它);注意導航欄(圖檔的右側)上變暗的白色的小點,他們代表了被隐藏的導航操作。

筆記53 | 管理系統UI(一)隐藏狀态欄隐藏導航欄我的Android征途

圖1.淡化的系統欄

圖2展示的是同一張圖檔,系統欄處于顯示的狀态。

筆記53 | 管理系統UI(一)隐藏狀态欄隐藏導航欄我的Android征途

圖2.顯示的系統欄

顯示狀态欄與導航欄

如果你想動态的清除顯示标簽,你可以使用

setSystemUiVisibility()

方法:

View decorView = getActivity().getWindow().getDecorView();
// Calling setSystemUiVisibility() with a value of  clears
// all flags.
decorView.setSystemUiVisibility();
           

隐藏狀态欄

編寫:K0ST
  • 原文:http://developer.android.com/training/system-ui/status.html

這節課将教您

  1. 在4.0及以下版本中隐藏狀态欄
  2. 在4.1及以上版本中隐藏狀态欄
  3. 在4.4及以上版本中隐藏狀态欄
  4. 讓内容顯示在狀态欄之後
  5. 同步狀态欄與Action Bar的變化

同時您應該閱讀

  • Action Bar API 指南
  • Android Design Guide

本課程将教您如何在不同版本的Android下隐藏狀态欄。隐藏狀态欄(或者是導航欄)可以讓内容得到更多的展示空間,進而提供一個更加沉浸式的使用者體驗。

圖1展示了顯示狀态欄的界面

筆記53 | 管理系統UI(一)隐藏狀态欄隐藏導航欄我的Android征途

圖1. 顯示狀态欄.

圖2展示了隐藏狀态欄的界面。請注意,Action Bar這個時候也被隐藏了。請永遠不要在隐藏狀态欄的時候顯示Action Bar。

筆記53 | 管理系統UI(一)隐藏狀态欄隐藏導航欄我的Android征途

圖2. 隐藏狀态欄.

在4.0及以下版本中隐藏狀态欄

在Android 4.0及更低的版本中,你可以通過設定

WindowManager

來隐藏狀态欄。你可以動态的隐藏,也可以在你的manifest檔案中設定Activity的主題。如果你的應用的狀态欄在運作過程中會一直隐藏,那麼推薦你使用改寫manifest設定主題的方法(嚴格上來講,即便設定了manifest你也可以動态的改變界面主題)。

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

設定主題的優勢是:

  • 易于維護,且不像動态設定标簽那樣容易出錯
  • 有更流暢的UI轉換,因為在初始化你的Activity之前,系統已經得到了需要渲染UI的資訊

另一方面我們可以選擇使用

WindowManager

來動态隐藏狀态欄。這個方法可以更簡單的在使用者與App進行互動式展示與隐藏狀态欄。

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 < ) {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
        setContentView(R.layout.activity_main);
    }
    ...
}
           

當你設定

WindowManager

标簽之後(無論是通過Activity主題還是動态設定),這個标簽都會一直生效直到你清除它。

設定了

FLAG_LAYOUT_IN_SCREEN

之後,你可以擁有與啟用

FLAG_FULLSCREEN

後相同的螢幕區域。這個方法防止了狀态欄隐藏和展示的時候内容區域的大小變化。

在4.1及以上版本中隐藏狀态欄

在Android 4.1(API level 16)以及更高的版本中,你可以使用setSystemUiVisibility()來進行動态隐藏。

setSystemUiVisibility()

在View層面設定了UI的标簽,然後這些設定被整合到了Window層面。

setSystemUiVisibility()

給了你一個比設定

WindowManager

标簽更加粒度化的操作。下面這段代碼隐藏了狀态欄:

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();
           

注意以下幾點:

  • 一旦UI标簽被清除(比如跳轉到另一個Activity),如果你還想隐藏狀态欄你就必須再次設定它。詳細可以看第五節如何監聽并響應UI可見性的變化。
  • 在不同的地方設定UI标簽是有所差別的。如果你在Activity的onCreate()方法中隐藏系統欄,當使用者按下home鍵系統欄就會重新顯示。當使用者再重新打開Activity的時候,onCreate()不會被調用,是以系統欄還會保持可見。如果你想讓在不同Activity之間切換時,系統UI保持不變,你需要在onResume()與onWindowFocusChaned()裡設定UI标簽。
  • setSystemUiVisibility()僅僅在被調用的View顯示的時候才會生效。
  • 當從View導航到别的地方時,用setSystemUiVisibility()設定的标簽會被清除。

讓内容顯示在狀态欄之後

在Android 4.1及以上版本,你可以将應用的内容顯示在狀态欄之後,這樣當狀态欄顯示與隐藏的時候,内容區域的大小就不會發生變化。要做到這個效果,我們需要用到

SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

這個标志。同時,你也有可能需要

SYSTEM_UI_FLAG_LAYOUT_STABLE

這個标志來幫助你的應用維持一個穩定的布局。

當使用這種方法的時候,你就需要來確定應用中特定區域不會被系統欄掩蓋(比如地圖應用中一些自帶的操作區域)。如果被覆寫了,應用可能就會無法使用。在大多數的情況下,你可以在布局檔案中添加

android:fitsSystemWindows

标簽,設定它為true。它會調整父ViewGroup使它留出特定區域給系統欄,對于大多數應用這種方法就足夠了。

在一些情況下,你可能需要修改預設的padding大小來擷取合适的布局。為了控制内容區域的布局相對系統欄(它占據了一個叫做“内容嵌入”

content insets

的區域)的位置,你可以重寫

fitSystemWindows(Rect insets)

方法。當視窗的内容嵌入區域發生變化時,

fitSystemWindows()

方法會被view的hierarchy調用,讓View做出相應的調整适應。重寫這個方法你就可以按你的意願處理嵌入區域與應用的布局。

同步狀态欄與Action Bar的變化

在Android 4.1及以上的版本,為了防止在Action Bar隐藏和顯示的時候布局發生變化,你可以使用Action Bar的overlay模式。在Overlay模式中,Activity的布局占據了所有可能的空間,好像Action Bar不存在一樣,系統會在布局的上方繪制Aciton Bar。雖然這會遮蓋住上方的一些布局,但是當Action Bar顯示或者隐藏的時候,系統就不需要重新改變布局區域的大小,使之無縫的變化。

要啟用Action Bar的overlay模式,你需要建立一個繼承自Action Bar主題的自定義主題,将

android:windowActionBarOverlay

屬性設定為true。要了解詳細資訊,請參考添加Action Bar課程中的Action Bar的覆寫層疊。

設定

SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

來讓你的activity使用的螢幕區域與設定

SYSTEM_UI_FLAG_FULLSCREEN

時的區域相同。當你需要隐藏系統UI時,使用

SYSTEM_UI_FLAG_FULLSCREEN

。這個操作也同時隐藏了Action Bar(因為

windowActionBarOverlay="true"

),當同時顯示與隐藏ActionBar與狀态欄的時候,使用一個動畫來讓他們互相協調。

隐藏導航欄

編寫:K0ST
  • 原文:http://developer.android.com/training/system-ui/navigation.html

這節課将教您

  1. 在4.0及以上版本中隐藏導航欄
  2. 讓内容顯示在導航欄之後

本節課程将教您如何對導航欄進行隐藏,這個特性是Android 4.0()版本中引入的。

即便本小節僅關注如何隐藏導航欄,但是在實際的開發中,你最好讓狀态欄與導航欄同時消失。在保證導航欄易于再次通路的情況下,隐藏導航欄與狀态欄使内容區域占據了整個顯示空間,是以可以提供一個更加沉浸式的使用者體驗。

筆記53 | 管理系統UI(一)隐藏狀态欄隐藏導航欄我的Android征途

圖1. 導航欄.

在4.0及以上版本中隐藏導航欄

你可以在Android 4.0以及以上版本,使用

SYSTEM_UI_FLAG_HIDE_NAVIGATION

标志來隐藏導航欄。這段代碼同時隐藏了導航欄和系統欄:

View decorView = getWindow().getDecorView();
// Hide both the navigation bar and the status bar.
// SYSTEM_UI_FLAG_FULLSCREEN is only available on Android  and higher, but as
// a general rule, you should design your app to hide the status bar whenever you
// hide the navigation bar.
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
              | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
           

注意以下幾點

  • 使用這個方法時,觸摸螢幕的任何一個區域都會使導航欄(與狀态欄)重新顯示。使用者的互動會使這個标簽

    SYSTEM_UI_FLAG_HIDE_NAVIGATION

    被清除。
  • 一旦這個标簽被清除了,如果你想再次隐藏導航欄,你就需要重新對這個标簽進行設定。在下一節響應UI可見性的變化中,将詳細講解應用監聽系統UI變化來做出相應的調整操作。
  • 在不同的地方設定UI标簽是有所差別的。如果你在Activity的onCreate()方法中隐藏系統欄,當使用者按下home鍵系統欄就會重新顯示。當使用者再重新打開activity的時候,onCreate()不會被調用,是以系統欄還會保持可見。如果你想讓在不同Activity之間切換時,系統UI保持不變,你需要在onReasume()與onWindowFocusChaned()裡設定UI标簽。
  • setSystemUiVisibility()僅僅在被調用的View顯示的時候才會生效。
  • 當從View導航到别的地方時,用setSystemUiVisibility()設定的标簽會被清除。

2)讓内容顯示在導航欄之後

在Android 4.1與更高的版本中,你可以讓應用的内容顯示在導航欄的後面,這樣當導航欄展示或隐藏的時候内容區域就不會發生布局大小的變化。可以使用

SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

标簽來做到這個效果。同時,你也有可能需要

SYSTEM_UI_FLAG_LAYOUT_STABLE

這個标簽來幫助你的應用維持一個穩定的布局。

當你使用這種方法的時候,就需要你來確定應用中特定區域不會被系統欄掩蓋。更詳細的資訊可以浏覽隐藏狀态欄一節。

我的Android征途