發生方向更改時,我在某些設備尺寸的切換活動&片段上遇到問題。在我的情況下,它是large
屏幕,但它可能會發生與其他屏幕大小取決於應用程序。我四處尋找答案,但似乎沒有妥善解決這個問題。在方向更改時切換片段或活動(即佈局)
我有兩個活動,MainActivity和SubordinateActivity。 MainActivity是該應用唯一的入口點; MainActivity啓動SubordinateActivity。每個活動都有自己的片段,MainFragment和SubordinateFragment。在normal
設備上運行時,不管方向如何,屏幕上只有一個片段的空間足夠多。在這種情況下,每個活動都會管理自己的片段。在xlarge
設備上,無論方向如何,都有足夠的空間存放兩個碎片。在這種情況下,有不同的佈局文件允許在屏幕上顯示兩個片段。 MainFragment和SubordinateFragment都由MainActivity管理(從不使用SubordinateActivity)。
屏幕出現問題,出現large
屏幕。使用橫向方向,有足夠的空間用於兩個片段,但是在縱向方向上不存在。我有每個適當的佈局文件。在橫向模式下,MainActivity管理這兩個片段(與xlarge
設備一樣)並且在縱向模式下,每個活動管理其自己的片段(與normal
設備一樣)。這會在兩種情況下產生問題:
- SubordinateActivity在縱向模式下加載,並且方向更改爲橫向模式。 我想要什麼:SubordinateActivity應該被丟棄,並且MainActivity應該加載,其中先前由SubordinateActivity顯示的內容顯示在它自己的SubordinateFragment中。 問題:SubordinateActivity在橫向模式下自行加載。
- MainActivity在橫向模式下使用MainFragment和SubordinateFragment加載,並且方向切換爲縱向。 我想要什麼:以前在SubordinateFragment中顯示的內容現在應該由SubordinateActivity單獨顯示。 問題:MainActivity僅顯示來自MainFragment的內容。
這個問題的一個很好的例子是GMail應用程序。以下是該應用的一些屏幕截圖,以供我不清楚我在說什麼。我意識到GMail應用的UI實際上比我的更復雜,但問題是一樣的。
我敢肯定,這是其他人都遇到過,因爲Gmail的開發者遇到它也有問題。我找不出什麼好的解決方案,因爲每種可能性似乎都涉及違反Android UI最佳實踐,或者在Activity代碼和XML佈局之間創建一些不負責任的糾結。
這裏有一些想法我有,其中沒有似乎真的正確:
- 檢測兩個活動的方向變化,並推出其他活動(例如,通過使用FLAG_ACTIVITY_CLEAR_TOP)去背下來的堆並以新的意圖加載以前加載的活動。這是一個問題,因爲方向更改代碼只能在
large
設備上執行,這意味着混合代碼可以檢查哪些佈局可用於活動代碼。 - 完全刪除SubordinateActivity。看起來有點多餘,MainActivity可以自行管理片段,即使在
normal
大小的設備上,它也可以根據需要交換MainFragment和SubordinateFragment。最後,我不認爲這解決了這個問題,因爲MainActivity仍然依賴佈局文件來告訴它顯示哪些和多少片段。這也違反了活動代表用戶所做的離散事情的原則。
這裏有一些資源,我一直在試圖解決這個問題。正如我所說,這似乎是一個常見問題,但似乎沒有規範的Android解決方案。這是一個缺點,因爲文檔建議使用Fragments,每個開發人員都會遇到這個問題。
- Tasks and Back Stack
- How to Controll Android back stack
- How to start a new activity when screen orientation changes? Android
- onNewIntent() lifecycle and registered listeners
- Multi-pane Layouts
- Switch from dual pane to single pane on orientation change maintaining fragment stack
- android Fragment issue with orientation change
- Fragments restore state on orientation changed
摘要:我多窗格模式xlarge
設備工作。我試圖解決的問題是在單個窗格(縱向)和多窗格(橫向)模式之間切換,只能在橫向上處理多個窗格。
OH!我流淚了。其中一個很小的問題在被問及之前經過恰當的研究和正確寫入,之後我就看到了。祝您找到您的解決方案!不幸的是,除了+1和一個明星之外,我無法貢獻 –