7

發生方向更改時,我在某些設備尺寸的切換活動&片段上遇到問題。在我的情況下,它是large屏幕,但它可能會發生與其他屏幕大小取決於應用程序。我四處尋找答案,但似乎沒有妥善解決這個問題。在方向更改時切換片段或活動(即佈局)

我有兩個活動,MainActivity和SubordinateActivity。 MainActivity是該應用唯一的入口點; MainActivity啓動SubordinateActivity。每個活動都有自己的片段,MainFragment和SubordinateFragment。在normal設備上運行時,不管方向如何,屏幕上只有一個片段的空間足夠多。在這種情況下,每個活動都會管理自己的片段。在xlarge設備上,無論方向如何,都有足夠的空間存放兩個碎片。在這種情況下,有不同的佈局文件允許在屏幕上顯示兩個片段。 MainFragment和SubordinateFragment都由MainActivity管理(從不使用SubordinateActivity)。

屏幕出現問題,出現large屏幕。使用橫向方向,有足夠的空間用於兩個片段,但是在縱向方向上不存在。我有每個適當的佈局文件。在橫向模式下,MainActivity管理這兩個片段(與xlarge設備一樣)並且在縱向模式下,每個活動管理其自己的片段(與normal設備一樣)。這會在兩種情況下產生問題:

  1. SubordinateActivity在縱向模式下加載,並且方向更改爲橫向模式。 我想要什麼:SubordinateActivity應該被丟棄,並且MainActivity應該加載,其中先前由SubordinateActivity顯示的內容顯示在它自己的SubordinateFragment中。 問題:SubordinateActivity在橫向模式下自行加載。
  2. MainActivity在橫向模式下使用MainFragment和SubordinateFragment加載,並且方向切換爲縱向。 我想要什麼:以前在SubordinateFragment中顯示的內容現在應該由SubordinateActivity單獨顯示。 問題:MainActivity僅顯示來自MainFragment的內容。

這個問題的一個很好的例子是GMail應用程序。以下是該應用的一些屏幕截圖,以供我不清楚我在說什麼。我意識到GMail應用的UI實際上比我的更復雜,但問題是一樣的。

GMail message listGMail message display

GMail in landscape orientation on large device

我敢肯定,這是其他人都遇到過,因爲Gmail的開發者遇到它也有問題。我找不出什麼好的解決方案,因爲每種可能性似乎都涉及違反Android UI最佳實踐,或者在Activity代碼和XML佈局之間創建一些不負責任的糾結。

這裏有一些想法我有,其中沒有似乎真的正確:

  • 檢測兩個活動的方向變化,並推出其他活動(例如,通過使用FLAG_ACTIVITY_CLEAR_TOP)去背下來的堆並以新的意圖加載以前加載的活動。這是一個問題,因爲方向更改代碼只能在large設備上執行,這意味着混合代碼可以檢查哪些佈局可用於活動代碼。
  • 完全刪除SubordinateActivity。看起來有點多餘,MainActivity可以自行管理片段,即使在normal大小的設備上,它也可以根據需要交換MainFragment和SubordinateFragment。最後,我不認爲這解決了這個問題,因爲MainActivity仍然依賴佈局文件來告訴它顯示哪些和多少片段。這也違反了活動代表用戶所做的離散事情的原則。

這裏有一些資源,我一直在試圖解決這個問題。正如我所說,這似乎是一個常見問題,但似乎沒有規範的Android解決方案。這是一個缺點,因爲文檔建議使用Fragments,每個開發人員都會遇到這個問題。

摘要:我多窗格模式xlarge設備工作。我試圖解決的問題是在單個窗格(縱向)和多窗格(橫向)模式之間切換,只能在橫向上處理多個窗格。

+3

OH!我流淚了。其中一個很小的問題在被問及之前經過恰當的研究和正確寫入,之後我就看到了。祝您找到您的解決方案!不幸的是,除了+1和一個明星之外,我無法貢獻 –

回答

3

SubordinateActivity並在您的應用程序的唯一入口點MainActivity然後決定或者填滿整個視口MainFragmentSubordinateFragment。您可以通過looking at the developer docs for the design guide you linked to找到一個示例。

後你這樣做,你可以創建特定的大和景觀資源文件夾,res/layout/large-landas stated here並設置佈局文件MainActivity以包括前一段的鏈接類似的教訓#2兩個片段。

除了正常的XML佈局之外,更改爲該文檔中描述的內容應自動處理您描述的所有內容,因爲在技術上重新定位方向更改在技術上是一種重新創建活動。

+0

「kill SubordinateActivity」是否意味着將其從代碼中刪除,僅使用單個活動,就像我上面列出的第二個選項或其他內容一樣? 另外,爲了澄清,MainActivity是唯一的入口點。 –

+0

我的意思是隻使用一項活動。你正在做的事情非常接近主 - 細節視圖,它最適合於一項活動。 –

相關問題