3.動態方向鎖定
3.1 問題
在某些特定的條件下,不能讓螢幕旋轉,但這個條件是臨時的或是根據使用者的意願決定的。
3.2 解決方案
(API Level 1)
藉助Android的請求方向機制(requested orientation mechanism),應用程式可以調整顯示Activity的螢幕方向,將其固定為某個方向或是交由裝置決定。這是通過呼叫Activity.SetReActivity的螢幕方向。這通常是根據裝置的物理方向來確定的。當前請求的方向可以隨時通過呼叫Activity.getRequestedOrientation()方法獲得。
3.3 實現機制
舉個示例,讓我們建立一個ToggleButton例項來控制是否鎖定當前螢幕方向,這樣就能讓使用者隨時控制Activity的方向。以下程式碼描繪了在其中定義ToggleButton例項的簡單佈局。
res/layout/activity_lock.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ToggleButton android:id="@+id/toggleButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:textOff="Lock" android:textOn="LOCKED" /> </FrameLayout>
在Activity程式碼中,我們給這個按鈕的狀態建立一個監聽器,根據按鈕的值決定鎖定或解鎖螢幕的方向(參見以下程式碼)。
動態鎖定/解鎖螢幕方向的Activity
public class LockActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_lock); //獲得按鈕資源的控制代碼 ToggleButton toggle = (ToggleButton)findViewById(R.id.toggleButton); //在新增監聽器之前設定預設狀態 if( getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED ) { toggle.setChecked(true); } else { toggle.setChecked(false); } //將監聽器關聯到按鈕 toggle.setOnCheckedChangeListener(new OrientationLockListener()); } private class OrientationLockListener implements CompoundButton.OnCheckedChangeListener { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { int current = getResources().getConfiguration().orientation; if(isChecked) { switch(current) { case Configuration.ORIENTATION_LANDSCAPE: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; case Configuration.ORIENTATION_PORTRAIT: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; default: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); } } else { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); } } }; }
監聽器中的這段程式碼是本攻略的關鍵。如果使用者按下這個按鈕,將其置為ON狀態,應用程式就通過儲存Resources.getConfiguration()的orientation引數讀取當前的螢幕方向。Configuration物件 用來表示螢幕方向的常數與所請求的方向使用的常數不同,所以我們根據當前的螢幕方向進行切換,然後再用合適的常熟呼叫setRequestedOrientation()方法。
注意:
如果所請求的方向跟當前狀態不一樣,且Activity在前臺,Activity就會立即切換方向以滿足請求。
如果使用者按下了這個按鈕,將其設為OFF狀態,我們就不再鎖定方向,因此用SCREEN_ORIENTATION_UNSPECIFIED常數再呼叫一次setRequestedOrientation(),將控制權交還給裝置。如果裝置當前的物理方向跟移除鎖定時的Activity方向不一致,也會導致螢幕切換方向。
注意:
設定請求的方向不會保持預設的Activity生命週期。如果裝置配置發生變化(例如物理鍵盤彈出,或是裝置方向改變),Activity依然會被銷燬並重新建立,因此所有保持Activity狀態的規則都適用。