2012-11-28 60 views
7

這是我希望我的應用程序在平板電腦上執行的操作。 片段(0)有一定的菜單,將顯示的片段(1)...(n)的這樣的:將Android片段移動到不同的容器不能更改片段的容器ID

----------------- 
| | | | | 
| | | | | 
|(0)| X | X | X | 
| | | | | 
| | | | | 
----------------- 
becomes 
----------------- 
| | | | | 
| | | | | 
|(0)|(1)| X | X | 
| | | | | 
| | | | | 
----------------- 
and then 
----------------- 
| | | | | 
| | | | | 
|(0)|(2)|(1)| X | 
| | | | | 
| | | | | 
----------------- 
etc... 

Fragment0從不移動時,另一個則分別向右移位。碎片離開邊緣向右將被銷燬。

所以我安裝我的XML佈局與水平的LinearLayout和含4的FrameLayout用正確的ID(fragment0 ... fragment3)

我可以實例化和顯示fragment0然後片段1,但我不能移它之後的權利,我得到:

ERROR/AndroidRuntime(343): FATAL EXCEPTION: main 
java.lang.IllegalStateException: Can't change container ID of fragment ... 

我發現的唯一有關的問題是this onethat one,嘗試了所有沒有運氣提供了不同的解決方案。

試圖FragmentTransaction.remove()其次.add(),試圖.replace(),他們嘗試以不同的順序,並通過(甚至試圖去提交兩倍有人建議)提交中途,試着撥打addToBackStack() ...仍然沒有運氣。

問題是否可以像這樣用FragmentTransaction移動片段。如果是的話,我做錯了什麼(和獎金,是否可以動畫?)。如果不是,那麼執行此操作的正確方法是什麼?

請注意,我不希望每次都重新實例化這些片段(每個都會在Web上進行一些查詢,這可能需要一些時間)。可以將所有數據提取回活動重新創建一個,但我寧願不這樣做,如果可能的話...

回答

3

我不知道這是不是你想要的,但我做了一個小樣本關於你的問題。基本上,你將使用佈局文件進行正確的轉換,爲每個移動片段提供一個包裝容器。代碼示例對於答案有點大,所以我已將它發佈到a gist that you can find here。在該示例中,按下ListFragment的每個項目(片段1→片段2→片段3)以查看行爲。

+0

它不會做什麼我期待的,但我試圖改變你的代碼做...我會後,如果我能... – Matthieu

+0

能夠做什麼,我需要.. 。無法弄清楚如何將我的更改推送到您創建的要點,所以我把它放在那裏:https://gist.github.com/4166640 – Matthieu

+0

對不起。這是一個錯字,它應該是'LinearLayout'而不是'frag_fragaccordion.xml'中的'RelativeLayout'嗎? – midnite

20

是的容器的片段可以使用remove()函數進行更改。

這裏的問題是commit()。這是一個異步調用,並將它安排在主線程上。所以強制FragmentManager在將其添加到其他容器之前立即執行此操作。

爲此,我們將不得不使用executePendingTransactions()功能。在調用這個之後,嘗試將片段添加到新的容器中。

文檔:executePendingTransactions()

代碼示例:

FragmentManager fManager = getSupportFragmentManager(); 
FragGroups fragGroups = (FragGroups) fManager.findFragmentByTag("groups"); 
if (fragGroups != null) { 
    fManager.beginTransaction().remove(fragGroups).commit(); 
    fManager.executePendingTransactions(); 
} else { 
    fragGroups = new FragGroups(); 
} 
if (mTwoPane) { 
    fManager.beginTransaction().replace(R.id.fragment_container_groups, fragGroups, "groups").commit(); 
} else { 
    fManager.beginTransaction().replace(R.id.fragment_container, fragGroups, "groups").commit(); 
} 

享受。飼料中後衛,歡迎

編輯

我想一個在這裏補充一點。由於我遇到同樣的問題,因此遇到了此線程並應用了建議的更改。問題依然存在。然後,我查看了最後一條評論,解決了我的問題:在提交事務時刪除addToBackStack()方法,或者如果您有意使用它,請將該片段從後端堆棧中移除,然後將其添加到另一個容器中。希望它能幫助未來的讀者。

+1

優秀的答案!可能不是最初的問題,但我發現它非常有用。 –

+2

Pavan .....我甚至不認識你......你甚至不認識我......但我對你有一些認真的愛,我的朋友。 – dell116

+0

@TomR我很高興你發現它很有用:) –

相關問題