Android - 重新膨胀片段导致"错误膨胀类片段"

时间:2014-09-12 21:28:17

标签: android google-maps android-layout android-fragments

我是Android开发的新手,但已经遇到了大麻烦。我已经在这里和其他网站上阅读了几个关于类似甚至相同问题的线程。但是我发现的所有答案都不符合我的需要,或根本不适合我。

所以这就是事情。我有一个活动,其中包含一个自制的“菜单”图层,包括活动底部的3个按钮和上面的ScrollView。现在单击其中一个按钮,我只需使用

将片段膨胀到ScrollView中
svContent.removeAllViews();
getLayoutInflater().inflate(R.layout.fragment_xyz, (ScrollView) findViewById(R.id.svContent));

膨胀得非常好。

现在膨胀的片段包含另一个谷歌地图片段(API 2),看起来像这样。

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

这个片段也按照我想要的方式填充其父片段的通胀,并且地图工作正常。

现在我点击另一个菜单按钮,让另一个片段膨胀。但是,当我再次单击第一个片段的按钮时,我收到以下错误:

  

将id xxxxx,tag null或parent id xxxxx与com.google.android.gms.maps.MapFragment的另一个片段重复

就像我说的那样,我尝试了几种在网上找到的解决方案,包括

  • 从扩展Fragment转移到FragmentActivity
  • 使用SupportMapFragment而不是Fragment
  • 从代码而不是XML
  • 中膨胀子片段(Google Maps one)

所有这些都有一些我目前无法接受的缺点(至少我认为)或“对我来说不起作用”或我的星座

非常感谢任何帮助。如果您需要更多信息,请告诉我。

此致 d。

3 个答案:

答案 0 :(得分:1)

要处理片段,您应该使用FragmentManager。这意味着您应该直接对片段进行充气。相反,您应该允许FragmentManager为您执行此操作。

答案 1 :(得分:1)

替换ScrollView中的片段:

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

如果您想使用后退按钮返回上一个幻灯片,请在提交前添加ft.addToBackStack(null);

就是这样。 顺便说一句,您可能不应该将ScrollView作为片段的容器。如果内容必须是可滚动的,请将片段放在片段中并将片段放在LinearLayout / FrameLayout / RelativeLayout中。

答案 2 :(得分:0)

当用户导航到另一个屏幕时,您需要将地图设为null。

在onDestroy方法时销毁谷歌地图实例。

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