2012-05-28 50 views
-1

我的活動有2種不同的縱向和橫向xml佈局。我試圖使用相同的片段的方向變化時,在活動的onCreate()代碼:在不同的容器中顯示片段,具體取決於方向

if (savedInstanceState == null) { 
    frag = Fragment 
     .instantiate(this, PlayerControlsFragment.class.getName()); 
} else { 
    frag = fragmentManager.findFragmentByTag(FRAG_TAG); 
} 

然後根據定位:

private void initLandscapePlayerFragment(FragmentTransaction ft) { 
    ft.add(R.id.layout_center_top, frag); 
} 
private void initPortraitPlayerFragment(FragmentTransaction ft) { 
    ft.add(R.id.layout_left_top, frag); 
} 

,它給了我一個很好的

IllegalStateException異常:不能改變片段分片的容器ID

事實上,當我在兩個xml中使用相同的容器標識時,它都能正常工作,但對我而言這不是一個解決方案。 我已經嘗試過不同的隨機解決方案(拆除之前摧毀活動等)沒有成功..
任何想法?

+0

爲什麼你需要不同的容器ID? – andyandy

+0

好吧,我的佈局結構是完全不同的,無論我是縱向還是橫向... – elgui

+0

並且縱向模式對於我的所有片段只使用一個容器(由操作欄導航選項卡切換),我無法在相同容器ID中使用相同的容器ID兩種模式(橫向顯示3個容器中的所有3個片段) – elgui

回答

-2

閱讀關於supporting multiple screens (#Using configuration qualifiers)的設計文檔,您不應該控制根據設備方向使用哪種佈局來充氣視圖。正確的方法是將景觀版本的視圖添加到\ * - land資源文件夾。通過將選擇哪個資源的控制權移交給Android來簡化您的代碼並刪除您擁有的私有init方法。你還有同樣的問題嗎?

+0

是的,我在/ res/layout中有一個main.xml,另一個在/ res/layout-land(我將在/ res/layout-xlarge-land中有一個),但這些完全不同: 1 - 人像僅包含一個容器,並且使用操作欄導航選項卡切換3個片段。 2景觀一包含3個容器,每個片段一個。 對於特定場景的任何推薦? – elgui

+0

我看到你在說什麼......我也娛樂了這種思路,但我並不需要實施它,因爲我對標籤的要求是由於屏幕空間不足而產生的,因此較小的屏幕設備具有標籤和較大的屏幕沒有,沒有像你的情況混合和匹配。是否有一個原因,你爲什麼要在代碼中添加片段?你能否用XML聲明它,因此放棄什麼是根容器ID的責任?我對你所看到的錯誤信息的理解是,FragManager不開心,你正在改變它能夠識別碎片的唯一東西。 – OceanLife

+0

好吧,我想fragmentManager也可以通過標記來識別它們......即使我在活動被破壞之前分離碎片,它也是不高興的!我最初從代碼中添加了片段,因爲它首先看起來更加靈活,因爲我也有一個沒有佈局的片段,因爲添加/添加代碼的組合會產生問題,並且由於使用了Actionbar導航選項卡爲這種做法設計...我可能會考慮使用這些選項卡來隱藏/顯示片段佈局,但如果沒有其他解決方案......非常令人失望! – elgui

0

對於其他人閱讀。請理解我們正在嘗試做什麼。我們不是簡單地處理屏幕旋轉。 我們試圖在屏幕旋轉和佈局更改後重新附加片段。

Android拋出一個關於不將片段附加回具有相同ID的容器的錯誤。問題在於,在佈局更改時,容器不存在,我們特別要附加到新的容器(因爲它是與多個面板不同的佈局ie.landscape)。

我可能就像你自己一樣沮喪。我發現你的答案沒有解決方案,從我所能說的是不可能的。無法在UI片段上設置RetainInstance(true),並在屏幕旋轉後重新附加。至少不要使用支持庫(本地支持可能會起作用,我不知道/不相關)。

最後,我只是讓碎片被轉儲並重新創建。

它可以是一個麻煩,因爲堆棧中仍然存在..

我不得不打電話

super.onCreate(null) 

傾銷片段交易堆棧中。

然後在onSaveStateInsance的包中使用我自己的信息重新創建與用戶期望的佈局更改(兩個片段中的哪一個現在佔據整個屏幕)一致的屏幕。

該行爲是高度專用的...所以我很樂意精心或討論它是如何適用於您的,但基本上要重申,我必須傾倒所有內容並從頭開始內聯符合用戶期望的內容,從android。事實上,android阻礙了後臺的運行,只會崩潰,無法殺死後臺堆棧,而是將null傳遞給super.oncreate調用。

+0

如果你知道一個更好的解決方案,那麼得到downvote的解釋會很棒,那真是太棒了。上面的答案確實有效。 –

0

我也必須解決這個問題。在我的情況下,我第一次使用「add」方法將片段添加到容器,並「去附着」以除去片段。理論上,「deattach」的優勢在於,當您稍後使用「attach」時,片段會自動轉到上一個容器。

此方法工作正常,直到用戶旋轉設備並更改容器,在這種情況下,如果容器不在屏幕上,您將會看到黑屏。

在調用attach方法之前有更改容器的可能性會很大,但顯然這是不可能的......在其他線程中,我有一些想法,例如在將片段添加到屏幕之前使用新的容器

Android Fragment - move from one View to another?

任何其他的想法?

相關問題