1. 程式人生 > >Android中顯示,隱藏Status Bar和Navigation Bar,沉浸式體驗

Android中顯示,隱藏Status Bar和Navigation Bar,沉浸式體驗

隨著Android版本的迭代更新,如何使某項特效能夠相容各個版本,一直困擾開發人員。比如狀態列(Status Bar)的顯示與隱藏,本篇文章也主要討論Android中狀態列(Status Bar)以及導航欄(Navigation Bar)的顯示與隱藏。

1.在Android4.0及以下隱藏Status Bar

在Android4.0(API level 14)及以下你可以通過設定 WindowManager 的標誌來隱藏Status Bar,你可以通過在程式碼中設定或者通過在manifest中設定activity的主題來實現。如果在你的APP中Status Bar需要一直隱藏,那麼最好的方法是在manifest中設定activity或者application的主題。

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

當然,你也可以在程式碼中設定 WindowManager 的標誌來實現。這種方式使得當程式需要根據使用者的互動來顯示或者隱藏Status Bar變得很容易。

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);
    }
    ...
}


當你設定了WindowManager 的標誌時,它會一直起作用,除非你清除這些標誌。

那麼問題來了,當我們因為需要隱藏Status Bar而啟用FLAG_FULLSCREEN標誌時,如果來清除此標記使得Status Bar重新顯示出來。這個時候我們可以通過設定  FLAG_LAYOUT_IN_SCREEN  標記來使Status Bar重新顯示,這也避免了你的佈局在Status Bar顯示或隱藏時需要重新調整大小。

2.在Android4.1(API level 16) 及以上隱藏Status Bar

在Android4.1(API level 16) 及以上隱藏Status Bar可以呼叫

setSystemUiVisibility()方法,該方法在一個獨特的檢視水平設定UI的標記,這些設定會聚集到window層級,相比設定WindowManager 的標記,使用這個方法可以讓你對Status Bar有更細粒度的控制。

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();
注意:

1.一旦UI標記被清除(比如離開當前activity),如果你想繼續隱藏Status Bar,你需要重新設定他們。

2.在哪個位置設定UI標記很重要。如果你在onCreate() 方法中設定,當用戶點選home鍵時,此時Status Bar會出現,當用戶再次開啟該activity時,方法不會被呼叫,導致Status Bar會一直顯示。如果你想在使用者導航到當前activity或者導航出當前activity時一直保持系統UI的改變,你應該在 或者 .中設定UI標記。

3.當你離開當前檢視時,通過該方法設定的UI標記會被清除。

3.使內容出現在Status Bar的後面(在Android 4.1及以上 

Android 4.1 及以上你可以設定你的應用程式的內容顯示在Status Bar的後面,這樣一來,當

在大多數情況下,你可以通過在你的佈局xml檔案中新增一個標記android:fitsSystemWindows,並設定為true,這會導致系統視窗的父佈局調整為系統視窗留的padding。這種方式對大多數app有效。

然而,在某些情況下,你需要更改預設的padding,來直接操作你的佈局相對於

4.Dim the Status and Navigation Bars

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

通過這種方式,當用戶觸控Status 和 Navigation Bars的區域時,會導致清除掉這個標記,一旦清除,如果你想繼續dim Status 和 Navigation Bars,你需要重新設定它。

5.顯示Status and Navigation Bars

如果你想在程式碼裡清除所有使用setSystemUiVisibility()方法設定的標記,可以按照如下方式:

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

6.隱藏導航欄(Hiding the Navigation Bar

隱藏導航欄(Android 4.0 (API level 14))及以上引入,可以使用SYSTEM_UI_FLAG_HIDE_NAVIGATION標記來隱藏導航欄,如下程式碼:

View decorView = getWindow().getDecorView();
// 同時隱藏 navigation bar 和 status bar.
// SYSTEM_UI_FLAG_FULLSCREEN 標記僅僅存在於 Android 4.1 及以上, 但是當你隱藏navigation bar時也應該隱藏status bar
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
              | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);

注意:

1.通過這種方式,觸控式螢幕幕的任何地方都會導致navigation bar (and status bar) 出現並且一直顯示,使用者的互動使得標記被清除。

2.一旦標記被清除,需要重新設定。

3.在哪個位置設定UI標記很重要。如果你在  方法中設定,當用戶點選home鍵時,此時Status Bar會出現,當用戶再次開啟該activity時,方法不會被呼叫,導致Status Bar會一直顯示。如果你想在使用者導航到當前activity或者導航出當前activity時一直保持系統UI的改變,你應該在 或者 .中設定UI標記。

4.當你離開當前檢視時,通過該方法設定的UI標記會被清除。

7.使程式的內容出現在導航欄(Navigation Bar)的後面

Android 4.1 及以上你可以設定你的應用程式的內容顯示在Navigation Bar的後面,這樣一來,當Navigation Bar顯示或者隱藏時,你的內容不僅就不需要重新調整大小了。要達到這樣的效果使用SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION標記。你可能同時需要使用SYSTEM_UI_FLAG_LAYOUT_STABLE幫助你的app持有一個穩定的佈局。

8.使用沉浸式的全屏模式

在Android 4.4 (API Level 19)為setSystemUiVisibility()引進了一個新的標記SYSTEM_UI_FLAG_IMMERSIVE,來使你的app真正的全屏。當這個標記與SYSTEM_UI_FLAG_HIDE_NAVIGATION 和 SYSTEM_UI_FLAG_FULLSCREEN結合使用,隱藏 navigation 和 status bars並且讓你的app能夠捕獲螢幕上的所有觸控事件。

當沉浸式全屏模式啟用,你的activity任然可以接收所有的觸控事件。使用者可以在system bars本來在的位置向內滑動從而使system bars顯示出來。當然這會導致標記 (如果設定了SYSTEM_UI_FLAG_FULLSCREEN也會被清除)會被清除。如果設定了監聽器View.OnSystemUiVisibilityChangeListener,此時會觸發這個監聽器。當然,如果你想讓system bars 隔一會後自動隱藏,你應該使用SYSTEM_UI_FLAG_IMMERSIVE_STICKY標記。注意,該標記不會觸發任何監聽器。

9.使用非粘性沉浸式

// This snippet hides the system bars.
private void hideSystemUI() {
    // Set the IMMERSIVE flag.
    // Set the content to appear under the system bars so that the content
    // doesn't resize when the system bars hide and show.
    mDecorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
            | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
            | View.SYSTEM_UI_FLAG_IMMERSIVE);
}

// This snippet shows the system bars. It does this by removing all the flags
// except for the ones that make the content appear under the system bars.
private void showSystemUI() {
    mDecorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}


10.使用粘性沉浸式

@Override
public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);}
}

11.監聽系統UI變化

要監聽系統UI的變化,需要註冊監聽器,如下所示:

View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener
        (new View.OnSystemUiVisibilityChangeListener() {
    @Override
    public void onSystemUiVisibilityChange(int visibility) {
        // Note that system bars will only be "visible" if none of the
        // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
            // TODO: The system bars are visible. Make any desired
            // adjustments to your UI, such as showing the action bar or
            // other navigational controls.
        } else {
            // TODO: The system bars are NOT visible. Make any desired
            // adjustments to your UI, such as hiding the action bar or
            // other navigational controls.
        }
    }
});

相關推薦

Android顯示隱藏Status BarNavigation Bar沉浸體驗

隨著Android版本的迭代更新,如何使某項特效能夠相容各個版本,一直困擾開發人員。比如狀態列(Status Bar)的顯示與隱藏,本篇文章也主要討論Android中狀態列(Status Bar)以及

android 顯示隱藏鍵盤

/** * 隱藏軟體盤方法的其中一種 * * @param token */ protected void hideSoftInput(IBinder token) { if (token != null) { Input

C#點選窗體最小化時隱藏工作列顯示托盤圖示

在窗體的Deactivate事件上,寫以下程式碼: private void Form1_Deactivate(object sender, EventArgs e)

淺談android的ListView之解決ScrollViewListView巢狀衝突(實際上一切都是浮雲閒的蛋疼)(一)

     相信大家都已經可以熟練使用ListView和GridView,大神們估計都在使用RecyclerView了。如果還在使用ListView,你肯定有這樣的一個深刻的感受,那就是在做一個APP的時候使用ListView和GridView很頻繁,並且經常會遇到一個頁面中

android多個activity用Intent跳轉時跳轉後的activity顯示白屏問題

昨天剛解決Intent無法成功跳轉到相應的activity問題後,後續的問題就來了---------跳轉後的activity介面顯示白屏,也就是自己編寫相應的.xml的內容沒顯示出來。在網上搜索了下問題答案,但是都說是setContentView()有問題,我是仔仔細細的檢

Android驗證輸入是否為漢字及手機號郵箱驗證IP地址可用port號驗證

bili repl ips gettext content 驗證 arr mat 數據 1,驗證是否為漢字 // 驗證昵稱 private boolean verifyNickname() { String nickname = edt_use

android的五大布局(控件的容器可以放button等控件)

orien ble frame http logs 控件 容器 div 以及 一.android中五大布局相當於是容器,這些容器裏可以放控件也可以放另一個容器,子控件和布局都需要制定屬性。 1.相對布局:RelativeLayout @1控件默認堆疊排列,需要制定控件的相

Android的常見通信機制Linux的通信機制

另一個 mes TCP/IP 物理內存 ram 中一 最簡 雙工 erp Handler Handler是Android系統中的一種消息傳遞機制,起作用是應對多線程場景。將A進程的消息傳遞給B線程,實現異步消息處理。很多情況是將工作線程中需要更新UI的操作消息傳遞給UI主線

AndroidAPK簽名工具之jarsignerapksigner詳解

內容 value signature align light 文件簽名 item als release 一.工具介紹 jarsigner是JDK提供的針對jar包簽名的通用工具, 位於JDK/bin/jarsigner.exe apksigner是Google官方提

PHP使用CURL實現模擬GETPOST請求親測完美解決

//初始化 $curl = curl_init(); //設定抓取的url curl_setopt($curl, CURLOPT_URL, 'http://www.baidu.com'); //設定標頭檔案的資訊作為資料流輸出 curl_setopt($cur

Android的Https網路請求getpost 不進行認證

HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer)是通過證書認證、資料加密打造的一條安全的HTTP通道,也就是安全版HTTP,一般在金融行業用到的比

Android監聽ScrollView滑動停止滑動到底部

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

GitHub最強大的iOS NotificationsAlertView框架沒有之一!

FFToast是一個非常強大的iOS message notifications和AlertView擴充套件。它可以很容易實現從螢幕頂部、螢幕底部和螢幕中間彈出一個通知。你可以很容易的自定義彈出的View. GitHub連結:https://github.com/imlifengfeng/F

AndroidFragment+Viewpager實現左右滑動點選

一.佈局檔案 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager android:id="@+id/viewpager" andr

Android實現靜態的預設安裝解除安裝應用

                最近好長時間都沒有寫blog了,主要是因為最近工作上的事以及下載Android原始碼的事耽誤的(下載原始碼這件事會在後續的blog中寫道,這個真的很有意義呀~~),那麼今天來寫點什麼呢?主要的靈感來自於早上看新聞看到一篇文章說有一款應用在後臺中解除安裝使用者手機中的所有瀏覽器的

AndroidPath類的lineTo方法quadTo方法畫線的區別

   當我們需要在螢幕上形成畫線時,Path類的應用是必不可少的,而Path類的lineTo和quadTo方法實現的繪製線路形式也是不一樣的,下面就以程式碼的實現來直觀的探究這兩個方法的功能實現區別;    1. Path--->quadTo(float x1, fl

Android 資原始檔圖片轉 Bitmap Drawable 以及相互轉換的方法

Android 圖片轉換的方法總結: 一、Bitmap 轉換成 Drawable 對 Bitmap 進行強制轉換 Drawable drawable = new BitmapDrawable(bmp); 二、Drawable 轉換成 Bitmap 方法一 通過 BitmapFa

android泛型方法的用法作用

舉個例子 首先我的activity中  @Route(path = "/datainit/DataInitActivity") class DataInitActivity: BaseActivity(){ override fun onCreate(savedInstan

C# 在Excel文件顯示隱藏批註

在Excel文件中插入批註預設情況是不會顯示的,如果插入的批註多了,想一次性快速檢視所有批註就會比較麻煩。此時我們可以選中插入批註的單元格,然後單擊選單欄“審閱”選項卡“批註”功能區中的“顯示或隱藏批註”選項來更改批註的顯示狀態。本文將介紹如何使用C#和Spire.XLS元

Android-- UI 佈局螢幕解析度相容版本相容螢幕適配解決方案

這篇文章主要是對解決螢幕適配問題思路的總結,會比較抽象,以後逐步把每條步驟對應的【案例】總結上去。 A: 拋開【業務需求】,螢幕適配解決方案的本質是:1.動態控制控制元件的尺寸,2.動態控制檢視佈局。 - 1.動態控制控制元件的尺寸:巧妙結合