實(shí)現(xiàn)輔助(外掛)
參考地址:http://developer.android.com/training/accessibility/index.html我們?cè)O(shè)計(jì)開發(fā)的App需要給更廣泛的人群使用,有一部分的在視力、手腳等方面可能有殘障,這時(shí)為了提高他們這部分人的用戶體驗(yàn),我們需要使用輔助服務(wù)來幫助他們來完成交互。也就是Android Framework中定義的Accessibility Services。
設(shè)計(jì)輔助程序
添加android:contentDescription屬性
利用Google基于聲音的TalkBack服務(wù) ,在UI元素上加 android:contentDescription屬性,可以使用這個(gè)服務(wù)將其讀出來,使得視力障礙者可以通過聲音訪問這些元素。例如:
有一些有狀態(tài)的UI(比如ToggleButton,CheckBox),就不能通過在布局中設(shè)置android:contentDescription來實(shí)現(xiàn),這時(shí)可以在代碼中動(dòng)態(tài)設(shè)置:
String contentDescription = "Select " + strValues[position];label.setContentDescription(contentDescription);
代碼很簡(jiǎn)單,但是卻很有用。下載TalkBack服務(wù),然后在 Settings > Accessibility > TalkBack中開啟服務(wù)即可使用。
Android不僅僅提供了觸摸屏的導(dǎo)航方式,還可以通過D-Pad、方向鍵或軌跡球來操作。后來Android還提供了通過USB或藍(lán)牙連接的外置鍵盤來操作。要使用這種形式的操作方式,必須讓設(shè)置操作的元素處于獲取焦點(diǎn)狀態(tài)(Focus),使用View.setFocusable()或在XML布局中設(shè)置 android:focusable屬性。另外,每個(gè)UI控件都有四個(gè)屬性android:nextFocusUp, android:nextFocusDown, android:nextFocusLeft和android:nextFocusRight,你可以用這些屬性定義在某個(gè)方向哪個(gè)控件將獲取焦點(diǎn),因?yàn)橄到y(tǒng)默認(rèn)是采用布局臨近原則來自動(dòng)決定順序的,采用這四個(gè)屬性可以人工干預(yù)。例如:有一個(gè)Button和一個(gè)TextView,都可以focus,當(dāng)按下方向鍵的時(shí)候焦點(diǎn)從button跳到TextView,按上焦點(diǎn)返回到button:
最好的驗(yàn)證方式是在模擬器上,操作上下方向鍵,來查看控件的焦點(diǎn)情況。
發(fā)送輔助事件
如果你使用AndroidFramework中的控件,那么不管何時(shí)它的選中狀態(tài)或焦點(diǎn)狀態(tài)發(fā)生變化,都可以發(fā)送AccessibilityEvent。這個(gè)事件是由accessibility service檢查的,可以提供像TTS那樣的功能。如果你寫一個(gè)自定義的View,要保證在適當(dāng)?shù)臅r(shí)候發(fā)送accessibility event。通過調(diào)用sendAccessibilityEvent(int)方法,其中參數(shù)代表發(fā)生的事件類,來創(chuàng)建一個(gè)事件。AccessibilityEvent提供了完整的事件類型列表。例如,你想繼承imageview以致于在它獲取焦點(diǎn)時(shí)可以通過鍵盤輸入標(biāo)題上去,這時(shí)需要發(fā)生一個(gè) TYPE_VIEW_TEXT_CHANGED事件,盡管這個(gè)事件一般沒有在內(nèi)置定義在imageview中。代碼如下:
public void onTextChanged(String before, String after) { ... if (AccessibilityManager.getInstance(mContext).isEnabled()) { sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED); } ...}
開發(fā)一個(gè)Accessibility Service
創(chuàng)建一個(gè)Accessibility Service
package com.example.android.apis.accessibility;import android.accessibilityservice.AccessibilityService;public class MyAccessibilityService extends AccessibilityService {... @Override public void onAccessibilityEvent(AccessibilityEvent event) { } @Override public void onInterrupt() { }...}
在Manifest中注冊(cè)Service,要特別指定android.accessibilityservice,當(dāng)應(yīng)用程序發(fā)出一個(gè)AccessibilityEvent時(shí)可以接收到。
...
. . .
...
配置Accessibility Service
配置Accessibility Service有兩種方式,兼容的方式是在代碼中配置。在onServiceConnected()中調(diào)用setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo)來配置輔助服務(wù):
@Overridepublic void onServiceConnected() { // Set the type of events that this service wants to listen to. Others // won't be passed to this service. info.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED | AccessibilityEvent.TYPE_VIEW_FOCUSED; // If you only want this service to work with specific applications, set their // package names here. Otherwise, when the service is activated, it will listen // to events from all applications. info.packageNames = new String[] {"com.example.android.myFirstApp", "com.example.android.mySecondApp"}; // Set the type of feedback your service will provide. info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN; // Default services are invoked only if no package-specific ones are present // for the type of AccessibilityEvent generated. This service is // application-specific, so the flag isn't necessary. If this was a // general-purpose service, it would be worth considering setting the // DEFAULT flag. // info.flags = AccessibilityServiceInfo.DEFAULT; info.notificationTimeout = 100; this.setServiceInfo(info);}
從Android4.0開始,我們可以將配置寫在一個(gè)XML文件中,一些配置選項(xiàng)比如canRetrieveWindowContent只能在XML中配置。和上面代碼同樣的配置選項(xiàng)的XML配置如下:
如果使用XML配置,還需要在Manifest文件中配置 屬性,指定輔助服務(wù)的resource為上面的XML配置文件:
響應(yīng)AccessibilityEvents
覆蓋onAccessibilityEvent(AccessibilityEvent)方法來處理AccessibilityEvents事件:
@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) { final int eventType = event.getEventType(); String eventText = null; switch(eventType) { case AccessibilityEvent.TYPE_VIEW_CLICKED: eventText = "Focused: "; break; case AccessibilityEvent.TYPE_VIEW_FOCUSED: eventText = "Focused: "; break; } eventText = eventText + event.getContentDescription(); // Do something nifty with this text, like speak the composed string // back to the user. speakToUser(eventText); ...}
查詢View Heirarchy獲取的Context
這個(gè)是 Android 4.0 (API Level 14) 上AccessibilityService 才有的能力,這種能力非常有用!我們需要在XML的配置中配置android:canRetrieveWindowContent=”true”。通過getSource()獲得AccessibilityNodeInfo對(duì)象,如果事件源的窗口仍然是活動(dòng)窗口,則這個(gè)調(diào)用返回一個(gè)對(duì)象;否則返回null。下面的例子是一個(gè)代碼片段,它接收到一個(gè)事件時(shí),作如下事情:1、直接抓住事件源View的父視圖2、在父View里,尋找一個(gè)label和checkbox作為子View3、如果找到了,創(chuàng)建一個(gè)string發(fā)給用戶,標(biāo)識(shí)checkbox是否被選中4、如果遍歷了整個(gè)view hierarchy返回null,則默默的放棄
// Alternative onAccessibilityEvent, that uses AccessibilityNodeInfo@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) { AccessibilityNodeInfo source = event.getSource(); if (source == null) { return; } // Grab the parent of the view that fired the event. AccessibilityNodeInfo rowNode = getListItemNodeInfo(source); if (rowNode == null) { return; } // Using this parent, get references to both child nodes, the label and the checkbox. AccessibilityNodeInfo labelNode = rowNode.getChild(0); if (labelNode == null) { rowNode.recycle(); return; } AccessibilityNodeInfo completeNode = rowNode.getChild(1); if (completeNode == null) { rowNode.recycle(); return; } // Determine what the task is and whether or not it's complete, based on // the text inside the label, and the state of the check-box. if (rowNode.getChildCount() < 2 || !rowNode.getChild(1).isCheckable()) { rowNode.recycle(); return; } CharSequence taskLabel = labelNode.getText(); final boolean isComplete = completeNode.isChecked(); String completeStr = null; if (isComplete) { completeStr = getString(R.string.checked); } else { completeStr = getString(R.string.not_checked); } String reportStr = taskLabel + completeStr; speakToUser(reportStr);}
現(xiàn)在,你有一個(gè)功能完整的accessibility servicel了。試著配置TTS引擎來更好的與用戶交互,或者使用振動(dòng)提供觸摸反饋。
系統(tǒng)狀態(tài)欄和導(dǎo)航欄
參考地址:http://developer.android.com/training/system-ui/index.html
變暗系統(tǒng)狀態(tài)欄
在Android 4.0(API14)及以上可以使用SYSTEM_UI_FLAG_LOW_PROFILE這個(gè)Flag很容易的變暗狀態(tài)欄。Android早期版本系統(tǒng)不提供一個(gè)內(nèi)置的API變暗狀態(tài)欄。
// 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);
當(dāng)用戶觸摸狀態(tài)或?qū)Ш綑?,這個(gè)flag就消失了,就恢復(fù)了明亮。如果想再次變暗它,就需要重新設(shè)置它。如果你要通過代碼清除flag,使用setSystemUiVisibility():
View decorView = getActivity().getWindow().getDecorView();// Calling setSystemUiVisibility() with a value of 0 clears// all flags.decorView.setSystemUiVisibility(0);
隱藏狀態(tài)欄
注意:狀態(tài)欄不可見時(shí),永遠(yuǎn)不要顯示action bar 。
在Android 4.0及以下版本上隱藏狀態(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); } ...}
可以使用FLAG_LAYOUT_IN_SCREEN這個(gè)flag設(shè)置你的Activity使用相同的屏幕區(qū)域,這樣就不會(huì)使?fàn)顟B(tài)欄不停的隱藏和顯示了。
在Android 4.1隱藏狀態(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();
注意:設(shè)置UI的flag只是當(dāng)時(shí)生效。比如你在onCreate()中設(shè)置隱藏狀態(tài)欄,點(diǎn)擊home回到桌面狀態(tài)欄顯示,再次進(jìn)入之后onCreate()不會(huì)再執(zhí)行,狀態(tài)欄就一直顯示,就會(huì)有問題了。解決方法是:在onResume()或onWindowFocusChanged()中設(shè)置flag使其消失。setSystemUiVisibility()方法只對(duì)可見的View有效設(shè)置過setSystemUiVisibility()的View再導(dǎo)航離開后,flag會(huì)消失。
讓界面內(nèi)容顯示在狀態(tài)欄的后面
在Android 4.1及以后,可以設(shè)置界面內(nèi)容在狀態(tài)欄的后面,這樣界面就不會(huì)因?yàn)闋顟B(tài)欄顯示和隱藏而resize了。使用SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN這個(gè)flag就可以了,還可以使用SYSTEM_UI_FLAG_LAYOUT_STABLE這個(gè)flag幫助app維持一個(gè)穩(wěn)定的布局。當(dāng)你使用這種方法時(shí),你就要對(duì)它負(fù)責(zé),來確保你的某些UI(比如地圖的內(nèi)置控件)不會(huì)被遮住而影響使用。多數(shù)情況下你可以在XML布局中設(shè)置android:fitsSystemWindows屬性為true來處理這種情況,這對(duì)大多數(shù)應(yīng)用都適用。某些情況下,可能你需要修改默認(rèn)的padding值來得到想要的合理布局。要直接操作內(nèi)容布局相對(duì)于狀態(tài)欄的位置(占據(jù)的那部分空間稱content insets),需要覆蓋fitSystemWindows(Rect insets)方法。fitSystemWindows方法在content insets發(fā)生變化被 view hierarchy時(shí)調(diào)用,允許window調(diào)整它的content。通過覆蓋這個(gè)方法,不管你想不想,你都可以處理這個(gè)insets 。
讓Actionbar和狀態(tài)欄同步
在Android 4.1及以上版本中,為避免在actionbar隱藏和顯示時(shí)resize你的布局,你可以為actionbar開啟覆蓋(overlay)模式。在覆蓋模式中,你的Activity使用盡可能大的空間好像Actionbar不在那兒一樣,其實(shí)actionbar是在布局的上面,只是布局頂部有一部分變模糊了,但現(xiàn)在actionbar不管顯示和隱藏,都不會(huì)resize布局了。打開覆蓋模式,需要?jiǎng)?chuàng)建一個(gè)自定義的主題,繼承一個(gè)帶有actionbar的主題,設(shè)置 android:windowActionBarOverlay=true。然后使用上面提到的SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN Flag,設(shè)置你的Activity在打開SYSTEM_UI_FLAG_FULLSCREEN flag時(shí)使用相同的屏幕區(qū)域。當(dāng)你要隱藏SystemUI時(shí),使用SYSTEM_UI_FLAG_FULLSCREEN的flag。這個(gè)也會(huì)隱藏action bar(因?yàn)閍ndroid:windowActionBarOverlay=true),而且在隱藏和顯示時(shí)有一個(gè)和諧的動(dòng)畫。
隱藏導(dǎo)航欄

vcC4oaM8L3A+DQo8cHJlIGNsYXNzPQ=="brush:java;"> View decorView = getWindow().getDecorView(); // Hide both the navigation bar and the status bar. // SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 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);
使用這個(gè)方法,用戶點(diǎn)擊屏幕任何地方將導(dǎo)致導(dǎo)航欄(和狀態(tài)欄)都重新顯示并保持。這個(gè)flag被清除后,需要重新設(shè)置它進(jìn)行隱藏導(dǎo)航欄其他部分都和狀態(tài)欄的注意部分一樣
讓界面內(nèi)容顯示在導(dǎo)航欄下面
在Android4.1及以上版本,使用SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION的flag使界面布局顯示在導(dǎo)航欄的下面,并使用SYSTEM_UI_FLAG_LAYOUT_STABLE保持布局。其他部分和狀態(tài)欄部分注意部分相同
使用沉浸式的全屏模式
在Android 4.4 (API Level 19)中為setSystemUiVisibility()新介紹了SYSTEM_UI_FLAG_LAYOUT_STABLE的flag,它讓你的app真實(shí)的進(jìn)入“全屏”模式,和SYSTEM_UI_FLAG_HIDE_NAVIGATION以及SYSTEM_UI_FLAG_FULLSCREEN結(jié)合起來時(shí),隱藏狀態(tài)欄和導(dǎo)航欄,app將捕獲全屏的觸摸事件。當(dāng)沉浸式全屏模式開啟后,你的Activity持續(xù)的接收全屏的觸摸事件。當(dāng)用戶沿著system bar一般顯示的地方向內(nèi)滑動(dòng)時(shí)會(huì)讓system bar顯示出來。這個(gè)動(dòng)作清除了SYSTEM_UI_FLAG_HIDE_NAVIGATION flag (以及 SYSTEM_UI_FLAG_FULLSCREEN,如果應(yīng)用的話),于是system bar變得可見,這會(huì)觸發(fā)View.OnSystemUiVisibilityChangeListener。然而,你希望system bar一會(huì)兒后再自動(dòng)隱藏,你可以使用SYSTEM_UI_FLAG_IMMERSIVE_STICKY的flag。注意這個(gè)粘性(”sticky” )的版本不會(huì)觸發(fā)任何監(jiān)聽事件,因?yàn)閟ystem bar在這種模式下只是暫時(shí)性的顯示。
非沉浸式模式。在app進(jìn)入沉浸式模式前的狀態(tài)。它也表示如果你使用沉浸式flag,當(dāng)用戶滑動(dòng)時(shí)清除了SYSTEM_UI_FLAG_HIDE_NAVIGATION 和 SYSTEM_UI_FLAG_FULLSCREEN顯示system bar的情況。這是保持UI控件和system bar同步的最好實(shí)踐,它最小化了屏幕的狀態(tài)數(shù)。這個(gè)提供了更加無縫的用戶體驗(yàn),所以這里所有的UI控件和狀態(tài)欄一起顯示。一旦進(jìn)入沉浸模式,UI控件將隨著system bar的隱藏而隱藏。為確保你的UI和system bar保持可見,使用View.OnSystemUiVisibilityChangeListener監(jiān)聽可見性的變化。 提示氣泡。當(dāng)用戶第一次進(jìn)入沉浸模式時(shí),系統(tǒng)將顯示一個(gè)提示氣泡。這個(gè)氣泡提示用戶將怎樣顯示system bar。注意:如果你想強(qiáng)制性的顯示提示氣泡用作測(cè)試意圖,你可以將app進(jìn)入沉浸模式,然后關(guān)閉屏幕,然后在5秒內(nèi)點(diǎn)亮屏幕。 沉浸模式。app進(jìn)入沉浸模式,system bars和其他UI控件都隱藏。 粘性Flag。這個(gè)UI是你使用IMMERSIVE_STICKY的Flag,然后用戶滑動(dòng)使system bar顯示的。半透明的bar臨時(shí)顯示然后會(huì)再隱藏?;瑒?dòng)行為不會(huì)清除任何flag,所以也不會(huì)觸發(fā)system UI可見性變化的監(jiān)聽。注意:沉浸的FLag只有你使用SYSTEM_UI_FLAG_HIDE_NAVIGATION, SYSTEM_UI_FLAG_FULLSCREEN的Flag或兩者都有的時(shí)候才會(huì)生效。通常情況下當(dāng)你使用“全屏沉浸”模式會(huì)隱藏狀態(tài)欄和導(dǎo)航欄。
SYSTEM_UI_FLAG_IMMERSIVE 和SYSTEM_UI_FLAG_IMMERSIVE_STICKY可以提供一個(gè)差異化的沉浸式的體驗(yàn)。下面是一些情況,你需要使用其中一個(gè),而不是另一個(gè):
當(dāng)你開發(fā)一個(gè)閱讀app,新聞app或雜志app時(shí),使用沉浸flag需要和SYSTEM_UI_FLAG_FULLSCREEN、 SYSTEM_UI_FLAG_HIDE_NAVIGATION兩者結(jié)合起來用。 當(dāng)你開發(fā)一個(gè)完全沉浸模式的app,期望用戶和屏幕的邊緣進(jìn)行交互而不期望用戶頻繁的和system UI交互,使用粘性沉浸的flag,結(jié)合SYSTEM_UI_FLAG_FULLSCREEN 和SYSTEM_UI_FLAG_HIDE_NAVIGATION使用。 如果你開發(fā)一個(gè)視頻播放器或其他很少需要用戶交互的app,你可能需要老一點(diǎn)版本的方法了( Android 4.0 (API Level 14)及以上)。因?yàn)閷?duì)于這類app,簡(jiǎn)單的使用SYSTEM_UI_FLAG_FULLSCREEN和會(huì)SYSTEM_UI_FLAG_HIDE_NAVIGATION的Flag就足夠了,不需要沉浸的flag。使用非粘性沉浸
這段代碼演示了如何隱藏和顯示狀態(tài)欄和導(dǎo)航欄,而不用resize界面的內(nèi)容。
// 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);}
1、注冊(cè)一個(gè)監(jiān)聽讓你的app得到system UI可見性變化的通知。2、實(shí)現(xiàn)onWindowFocusChanged()方法。如果你獲得window的焦點(diǎn),你可能想重新隱藏system bar。如果你失去了window的焦點(diǎn),例如一個(gè)對(duì)話框或彈出菜單,你可能想取消之前的Handler.postDelayed()或類似方法安排的隱藏操作。3、實(shí)現(xiàn)一個(gè)GestureDetector ,讓它監(jiān)測(cè)onSingleTapUp(MotionEvent),讓用戶可以通過觸摸content手動(dòng)控制system bar的可見性。簡(jiǎn)單的click監(jiān)聽不是最好的解決方案因?yàn)楫?dāng)用戶在屏幕滑動(dòng)手指都可以觸發(fā)。
使用粘性沉浸
當(dāng)你使用SYSTEM_UI_FLAG_IMMERSIVE_STICKY的flag,在system bar內(nèi)部區(qū)域的滑動(dòng)會(huì)導(dǎo)致其半透明狀態(tài)并暫時(shí)性的顯示但沒有flag被清除,你的system UI的可見性監(jiān)聽沒有被觸發(fā)。system bar會(huì)在一會(huì)兒以后再次隱藏或用戶在content交互下。下圖展示了當(dāng)使用IMMERSIVE_STICKY的flag時(shí)半透明的system bar短暫的顯示然后隱藏下面是一個(gè)簡(jiǎn)單的方法來使用這個(gè)flag:
@Overridepublic 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);}}
如果你喜歡IMMERSIVE_STICKY的flag的自動(dòng)隱藏行為,但是需要同時(shí)顯示你自己的UI控件,使用 IMMERSIVE和Handler.postDelayed()或者其它一些類似的在一會(huì)兒之后可以重新進(jìn)入沉浸模式的方式。
響應(yīng)UI可見性的變化
要獲得UI可見性變化的通知,需要為你的View注冊(cè)View.OnSystemUiVisibilityChangeListener,例如在你的Activity中的onCreate()中:
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. } }});
通常保持UI與system bar可見性變化的一致性是不錯(cuò)的實(shí)踐。例如,你可以通過這種方式讓action bar和狀態(tài)欄保持一致的變化狀態(tài)。