2014-09-12 140 views
2

我都是新來的Android開發,但已經很大的麻煩。我在這裏和其他網站上閱讀了幾個關於類似問題或甚至相同問題的線索。但是我發現的所有答案都不符合我的需求,或者根本不適合我。Android - 重新膨脹一個片段導致「錯誤膨脹類的片段」

所以,這是事情。我有一個自制的「菜單」圖層,包括活動底部的3個按鈕和上面的ScrollView。現在上點擊這些按鈕中的一個I簡單地使用

svContent.removeAllViews(); 
getLayoutInflater().inflate(R.layout.fragment_xyz, (ScrollView) findViewById(R.id.svContent)); 

其被充氣完全正常充氣一個片段插入到滾動型。

現在膨脹的片段包含Google Maps(API 2)的另一個片段,看起來像這樣。

<fragment 
    android:id="@+id/fMap" 
    android:name="com.google.android.gms.maps.MapFragment" 
    android:layout_width="fill_parent" 
    android:layout_height="150dp" /> 

此片段也填充了我想對其父片段的通貨膨脹和地圖工作正常的方式。

現在我點擊另一個菜單按鈕來讓另一個片段被充氣。但就當我再次點擊第一個片段的按鈕,我得到以下錯誤:

Duplicate id xxxxx, tag null, or parent id xxxxx with another fragment for com.google.android.gms.maps.MapFragment

就像我說的,我已經嘗試了幾種解決方案,我在網上找到的,包括

  • 從延伸片段移動使用,而不是片段
  • 充氣子片段SupportMapFragment FragmentActivity
  • 從代碼,而不是XML(谷歌地圖的一個)

所有這些有幾個缺點,我不能在此刻接受(至少我認爲)或「沒有工作」爲我或我的星座

任何幫助是極大的讚賞。如果您需要更多信息,請告訴我。

問候, D.

+0

爲什麼你「無法接受」通過代碼創建片段?這是4行代碼,它不會改變任何東西,它會完美地工作。 – 2014-09-12 21:31:24

+2

嘗試移動到另一個星座。仙女座......也許? – Emmanuel 2014-09-12 21:33:19

+0

@StephaneMathis從代碼中創建片段是我完全可以接受的,但不幸的是,它不適合我 - 至少不是我在查看api文檔時找到的示例。我不記得我用過它的確切問題,在過去的兩天裏,我只是在解決方案上嘗試過很多次。但我當然可以再試一次,你有沒有過時的工作例子? – tetzlaff 2014-09-12 21:38:18

回答

1

要在滾動型替換片段:

SupportMapFragment mapFragment = MapFragment.newInstance(); 
    FragmentTransaction ft = getChildFragmentManager().beginTransaction(); 
    ft.replace(R.id.svContent, _mapFragment); 
    ft.commit(); 

如果你想回到以前的frgament與後退按鈕,在提交前添加ft.addToBackStack(null);

就是這樣。 順便說一句,你應該沒有ScrollView作爲你的碎片的容器。如果內容必須是滾動的,把滾動你的片段,並把片段中的LinearLayout/FrameLayout裏/ RelativeLayout的。

+1

太棒了,這個暗示與Code-Apprentice的評論相結合,推動了我朝着正確的方向前進。我的問題是一個結構化的問題 - 混合使用FragmentManager的手動膨脹和使用SupportFragments的常規碎片。您的輸入使我重新處理了片段處理,顯然我現在做得正確。 – tetzlaff 2014-09-13 22:00:54

1

要處理的片段,你應該使用FragmentManager。這意味着你應該而不是直接膨脹一個片段。相反,你應該允許FragmentManager爲你做。

0

當用戶導航到另一個屏幕時,您需要將地圖設置爲空。

當onDestroy方法破壞google map實例時。

@Override 
    protected void onDestroyView() { 
Fragment fragment = getFragmentManager().findFragmentById(R.id.fMap); 
     getFragmentManager().beginTransaction().remove(fragment); 
     gMap.clear(); 
gMap = null; 
     super.onDestroy(); 
    }