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可以呼叫
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 Bar和Navigation 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之解決ScrollView和ListView巢狀衝突(實際上一切都是浮雲,閒的蛋疼)(一)
相信大家都已經可以熟練使用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主線
Android中APK簽名工具之jarsigner和apksigner詳解
內容 value signature align light 文件簽名 item als release 一.工具介紹 jarsigner是JDK提供的針對jar包簽名的通用工具, 位於JDK/bin/jarsigner.exe apksigner是Google官方提
PHP中使用CURL實現模擬GET和POST請求,親測完美解決
//初始化 $curl = curl_init(); //設定抓取的url curl_setopt($curl, CURLOPT_URL, 'http://www.baidu.com'); //設定標頭檔案的資訊作為資料流輸出 curl_setopt($cur
Android中的Https網路請求get和post 不進行認證
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer)是通過證書認證、資料加密打造的一條安全的HTTP通道,也就是安全版HTTP,一般在金融行業用到的比
Android中監聽ScrollView滑動停止和滑動到底部
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
GitHub中最強大的iOS Notifications和AlertView框架,沒有之一!
FFToast是一個非常強大的iOS message notifications和AlertView擴充套件。它可以很容易實現從螢幕頂部、螢幕底部和螢幕中間彈出一個通知。你可以很容易的自定義彈出的View. GitHub連結:https://github.com/imlifengfeng/F
Android中Fragment+Viewpager實現左右滑動和點選
一.佈局檔案 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager android:id="@+id/viewpager" andr
Android中實現靜態的預設安裝和解除安裝應用
最近好長時間都沒有寫blog了,主要是因為最近工作上的事以及下載Android原始碼的事耽誤的(下載原始碼這件事會在後續的blog中寫道,這個真的很有意義呀~~),那麼今天來寫點什麼呢?主要的靈感來自於早上看新聞看到一篇文章說有一款應用在後臺中解除安裝使用者手機中的所有瀏覽器的
Android中Path類的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.動態控制控制元件的尺寸:巧妙結合