2013-02-07 59 views
2

決定重寫了這個問題:開關片段,同時維護國家

我有三個片段給他們打電話A B C.每間都設有供用戶填寫一些字段的視圖。用戶應該能夠使用菜單在不同的片段之間切換。如果用戶填寫片段A中的信息,然後切換到C填寫更多信息,然後切換回A,則用戶在A中鍵入的信息仍然應該存在。

我想我需要以某種方式使用FragmentManager但我無法找出正確的組合,增加/替換/高度......這都需要做出它的工作就是我想要的。

是否有人可以提供一個代碼片段,讓我到片段之間進行切換,同時保持每個片段的視圖狀態。

當前工作溶液:

mContent是活動片段,並且是活性的私有成員變量。

如果有人看到什麼不對這種方法或一種方法,使之更有效率/更穩健請讓我知道!

public void switchContent(String fragmentTag) { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 

    if (fragmentManager.findFragmentByTag(fragmentTag) != mContent) { 
     if (!mContent.isDetached()) { 
      transaction.detach(mContent); 
     } 

     if (fragmentManager.findFragmentByTag(fragmentTag) == null) { 
      if (fragmentTag.equals("details")) { 
       mContent = ScheduleDetailsFragment.newInstance(); 
      } else if (fragmentTag.equals("notes")) { 
       mContent = ScheduleNotesFragment.newInstance(); 
      } else if (fragmentTag.equals("exceptions")) { 
       // @TODO - Create Exceptions Fragment 
      } 
     } else { 
      mContent = (SherlockFragment) fragmentManager.findFragmentByTag(fragmentTag); 
     } 
     if (mContent.isDetached()) { 
      transaction.attach(mContent); 
     } else if (!mContent.isAdded()) { 
      transaction.add(R.id.content_frame, mContent, fragmentTag); 
     } 

     transaction.commit(); 
    } 
    getSlidingMenu().showContent(); 
} 

謝謝你, 彌敦道

+0

使用.detach(),您的狀態正在被這種方法丟失嗎?重新連接時,您的觀點會丟失嗎?或者這給出了正確的結果? – flobacca

+0

這給正確的結果,只是不知道,如果它堅持片段的最佳實踐/如果能夠變得更好。 – Nath5

回答

1

我根據我提供的一個例子的代碼,但它每次返回菜單項點擊是這樣的狀態信息將丟失一個新片段。

如果您的網頁守住某種形式的國家/會話,每一個導航事件返回一個新Fragment是一個非常糟糕的用戶體驗,同時也對內存的使用不是那麼好。

我建議讓您的滑動菜單在您的主要Activity中使用FragmentManager來維護您在其間切換的所有Fragments。它將管理他們的所有狀態,並且您可以使用findFragmentByTag(String tag)來檢索它們。你只需要確保每個Fragment節省您在onSaveInstanceState(Bundle outState)onCreate(Bundle savedInstanceState)添加,並恢復它的任何狀態(值/數據初始創建後改變)。我不確定你目前使用的滑動菜單是如何管理的,所以這可能是不可能的。希望這至少有助於你朝着正確的方向前進。

編輯︰更新問題的答案 - 這裏是我如何切換Fragments。通過使用替換,您將完全切換Fragments,同時重新使用已創建的。爲了讓你的片段保存/恢復他們的狀態,你需要參考我上面的答案。如果還不清楚,搜索如何保存FragmentsActivities國家的一些例子。

public void switchContent(String fragmentTag) { 

    // If our current fragment is null, or the new fragment is different, we need to change our current fragment 
    if (mContent == null || !mContent.getTag().equals(fragmentTag)) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction transaction = fragmentManager.beginTransaction(); 

     // Try to find the fragment we are switching to 
     Fragment fragment = fragmentManager.findFragmentByTag(fragmentTag); 

     // If the new fragment can't be found in the manager, create a new one 
     if (fragment == null) { 
      if (fragmentTag.equals("details")) { 
       mContent = ScheduleDetailsFragment.newInstance(); 
      } 
      else if (fragmentTag.equals("notes")) { 
       mContent = ScheduleNotesFragment.newInstance(); 
      } 
      else if (fragmentTag.equals("exceptions")) { 
       // @TODO - Create Exceptions Fragment 
      } 
     } 
     // Otherwise, we found our fragment in the manager, so we will reuse it 
     else { 
      mContent = (SherlockFragment) fragment; 
     } 

     // Replace our current fragment with the one we are changing to 
     transaction.replace(R.id.content_frame, mContent, fragmentTag); 
     transaction.commit(); 

     getSlidingMenu().showContent(); 
    } 
    else { 
     // Do nothing since we are already on the fragment being changed to 
    } 
} 
+0

感謝您的回覆。我更改了我的代碼,以便主要活動具有不同片段的數組。但即使我使用相同的片段,它仍然會丟失所有的狀態數據。如果我使用oneSaveInstanceState,則不需要手動將所有UI元素都設置回原來的樣子。有沒有更好的方式來做到這一點? – Nath5

+0

如果你不使用'FragmentManager'來管理'Fragments'(提示提示),你必須在你的'Activity'中手動保存和恢復'Fragments'數組。這是可行的,但是由於'FragmentManager'爲你做了它,所以很浪費。 「onCreate」和「onSaveInstanceState」的簡單流程是保存您在'onSaveInstanceState'中使用的所有狀態,並在'onCreate'中設置/恢復這些變量。大多數視圖會爲您恢復其狀態。基本上你不需要做比'onCreate'設置更多的視圖,並恢復你可能添加的任何自定義狀態。 –

+0

我敢肯定,你只是想從這個UI中分離出這些片段,而不是像'replace'那樣將它們從'FragmentManager'中移除。 – Benten