2014-09-12 95 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(); 
    }