簡體   English   中英

Android方向更改:不同的布局,相同的碎片

[英]Android Orientation Change: Different Layout, Same Fragments

這幾乎是一個經典的Android用例。

假設我們有2個片段:FragmentA和FragmentB。

在橫向模式下,FragmentA和FragmentB並排放置。

在縱向模式下,它們在使用時都會占據整個屏幕。

(請參閱此圖片,但更換平板電腦 - >風景和手機 - >肖像) 不同的布局,相同的方向變化碎片

如此處所述( 支持單窗格和多窗格布局 ),有兩種方法可以實現此目的:

1-多個片段,一個活動:無論設備大小如何,都使用一個活動,但在運行時決定是否在布局中組合片段(以創建多窗格設計)或交換片段(以創建單窗格設計)。

2-多個片段,多個活動:在平板電腦上,將多個片段放在一個活動中; 在手機上,使用單獨的活動來托管每個片段。 例如,當平板電腦設計在活動中使用兩個片段時,對手機使用相同的活動,但提供僅包含第一個片段的替代布局。 當在手機上運行並且您需要切換片段時(例如當用戶選擇項目時),啟動另一個托管第二個片段的活動。

這在理論上很有意義,但是我試圖以一種方式實現這些方法中的任何一種方法遇到一些障礙,這種方法在方向改變時和按下后退按鈕時恢復碎片的狀態

我嘗試了第一種方法並且相當遠,但發現它很亂,因為它需要手動管理所有片段事務,特別是因為片段的容器不能輕易更改。 由於Backstack上的最后一個事務可能屬於另一個方向,因此決定在后退時執行什么操作也很痛苦。

現在我正在嘗試第二種選擇。 到目前為止它看起來更干凈,但片段會在每次方向更改時從頭開始重新創建(因為每個方向使用不同的Activity)。 我想有辦法從其他活動/方向恢復Fragment狀態。

任何人都可以解釋如何做到這一點,或指向我適當的教程或示例應用程序?

  • MainActivity中添加此配置,其中Fragment被替換為<activity android:name=".MainActivity" android:configChanges="orientation|screenSize|keyboard|keyboardHidden" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT"/></intent-filter> </activity
  • 您已為FragmentAFragmentB創建片段橫向布局 在此輸入圖像描述
  • 如果你需要改變兩個片段的行為,你應該改變片段的onConfigurationChanged事件。

@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { //write your stuff for landscape orientation }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { //write your stuff for portrait orientation } }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM