2013-09-25 107 views
7

我對在兩個片段之間切換的單個活動的最佳方式感興趣。在兩個片段之間切換的最佳方式

我讀過大概15堆棧溢出帖子和5篇博客帖子,關於如何做到這一點,而且,雖然我認爲我拼湊了一個解決方案,但我不相信它是最好的。所以,我想聽取人們的意見,以正確的方式來處理這個問題,特別是關於父母活動和片段的生命週期。

下面是詳細的情況:

  1. 可以顯示兩種可能的片段之一的父活動。
  2. 這兩個片段的狀態是,我想堅持一個會話,但不一定需要在會話之間持續。
  3. 許多其他活動,例如父活動和碎片可能會埋在背堆棧中並由於內存不足而被破壞。
  4. 我希望能夠使用後退按鈕在片段之間移動(所以據我瞭解,我不能使用setRetainInstance)。

除了通用架構的建議,我有以下突出問題:

  1. 如果父活動被摧毀,由於內存不足,我該如何保證兩個片段的狀態將被保留,根據這個職位:When a Fragment is replaced and put in the back stack (or removed) does it stay in memory?。我只需要一個指向父活動中每個片段的指針?
  2. 父級活動跟蹤當前顯示哪個片段的最佳方式是什麼?

在此先感謝!

回答

6

我最終使用支持片段管理器添加了兩個片段,然後使用detach/attach在它們之間切換。我能夠使用commitAllowingStateLoss(),因爲我保留了視圖的狀態,並在onResume()中手動設置了正確的片段。

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.add(R.id.my_layout, new AFragment(), TAG_A); 
    fragmentTransaction.add(R.id.my_layout, new BFragment(), TAG_B); 
    fragmentTransaction.commit(); 
} 

public void onResume() { 
    super.onResume(); 
    if (this.shouldShowA) { 
     switchToA(); 
    } else { 
     switchToB(); 
    } 
} 

private void switchToA() { 
    AFragment fragA = (AFragment) getSupportFragmentManager().findFragmentByTag(TAG_A); 
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.detach(getSupportFragmentManager().findFragmentByTag(TAG_B)); 
    fragmentTransaction.attach(fragA); 
    fragmentTransaction.addToBackStack(null); 

    fragmentTransaction.commitAllowingStateLoss(); 
    getSupportFragmentManager().executePendingTransactions(); 
} 
2

您可能需要考慮在父活動中使用ViewPager,以便您可以在碎片之間切換。

所以你可以通過它們滑動。

如果要在會話期間保持其狀態,即使父活動已被破壞,您也需要使它們成爲Parcelable,因此即使該類未在此時實例化,也可以保存該狀態。如果您旋轉設備並希望保持屏幕上的當前狀況/數據,則還需要執行此操作。

您應該將它們寫入Parcelable的方法中,然後在onResume之一中重新創建它們。這種方式不管它們是否因設備方向發生變化而被破壞或必須重新創建。

如果您希望能夠使用Backbutton在這些片段之間切換,您可以捕獲buttonClick爲onBackPressed並相應地處理它。

如果您需要弄清楚在給定時間顯示的是什麼片段,您可以詢問ViewPager他當時正在顯示的片段,因此您不必跟蹤,只需詢問知道的人你需要知道它。

+0

感謝您的回覆。我不認爲我可以在這裏使用視圖尋呼機,因爲視圖不應該在兩者之間滑動。我一定會實現parcelable。我在哪裏實施onBackPressed? – GLee

+0

OnBackPressed是一個活動的方法。所以你必須在那裏覆蓋它。 –

相關問題