我有一個包含許多活動並且具有適用於手機尺寸(SFF)和平板電腦尺寸(LFF)設備的佈局的應用程序。對於LFF設備,框架根據方向變化自動重新創建活動(風景< - >縱向)工作得很好,按照我的需要進行。在SFF設備上操作時,我可以使用Activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
將方向鎖定爲肖像。在不重新啓動當前活動的情況下調用方向更改的活動
當在SFF設備上運行時,我想在設備物理旋轉到橫向時啓動不同的活動。 (讓我們暫時擱置討論旋轉時啓動不同的活動是否是一個好的設計原則。)
最初我使用OrientationEventListener
來監視旋轉,但是在SFF設備的「自然」方向是風景。 OrientationEventListener.onOrientationChanged()
將報告0度(+/- 45),WindowManager.getDefaultDisplay().getRotation()
將在橫向方向報告Surface.ROTATION_0
。我無法找到確定設備「自然」方向的方法,以補償報告的旋轉值。有幾個討論這個問題的SO問題,但似乎沒有一個滿意的答案。
另一種選擇是在清單中使用android:configChanges="orientation|screenSize"
並捕獲onConfigurationChanged()
中的方向更改。問題在於它擊敗了LFF設備的默認行爲並且我希望保留它。一個可怕的黑客會出現:重複LFF和SFF版本的清單中的每個活動,其中一個沒有設置,另一個沒有設置,然後讓活動在每次啓動新活動時選擇合適的版本。
我目前的解決方案既不使用android:configChanges
也不使用setRequestedOrientation()
和OrientationEventListener
。相反,我有一個布爾資源is_landscape
,在values-land
中定義,我在相關活動的'onCreate()
中測試了這個。這樣做的缺點是,當旋轉到橫向:
- 唯一的肖像的活動,爲即將推出的景觀活動,首先得到由框架,這是相當昂貴的,並能延緩推出的景觀重建活動;和
- 縱向活動將失去一些狀態,否則這些狀態通常會被框架保留下來,並且在景觀活動返回時可用。
任何人都可以提出更好的解決方案,包括可能的方式來發現設備的「自然」方向?我需要這個回到Android 4.0。
如果'Activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)'被調用了嗎? – awy
@awy:是的,它確實有效 – JiTHiN
其實它不會,但不管。正如我可以調用你建議在我調用Activity.setRequestedOrientation()之前發現自然方向的代碼,那麼這就足夠了。感謝您指點我正確的方向。 – awy