【问题标题】:Not able to inflate Google Maps API v2 in fragment twice无法在片段中膨胀 Google Maps API v2 两次
【发布时间】:2013-12-06 08:22:40
【问题描述】:

好的,我已经检查了大约 100 个 SO QA。

故事是这样的:我有一个 SlidingMenu,其中包含“创建事件”和“所有事件”项。 “创建事件”菜单有一个地图片段,如下所示。用户选择“创建事件”并且地图在屏幕上没有错误,然后用户选择“所有事件”并显示事件并且用户再次选择“创建事件”并繁荣:

Caused by: java.lang.IllegalArgumentException: Binary XML file line #45: Duplicate id 0x7f040058, tag null, or parent id 0x0 with another fragment for pl.mg6.android.maps.extensions.SupportMapFragment

每次用户从左侧菜单中选择时都会创建 CreateEventFragment:

public void showCreateNewEventFragment() {
    CreateEventFragment fragment = new CreateEventFragment();
    showFragment(fragment);
    slidingMenu.showContent();
}

create_event.xml

...    
<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_below="@+id/searchLayout"
    android:layout_marginTop="8dp"
    android:background="@color/app_color"
    android:padding="6dp" >

    <fragment
        android:id="@+id/map"
        android:name="pl.mg6.android.maps.extensions.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>
...

CreateEventFragment.java

public class CreateEventFragment extends BaseFragment {

    private GoogleMap mMap;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    setRetainInstance(true);
    View v = (View) inflater.inflate(R.layout.create_event, container,
            false);
    ((MainActivity) getActivity())
            .showSlidingMenu(LeftNavigation.ITEM_CREATE_NEW_EVENT);
    initGoogleMaps(v, savedInstanceState);
    return v;
}

private void initGoogleMaps(View v, Bundle savedInstanceState) {
    EventshipApplication app = (EventshipApplication) getActivity()
            .getApplication();
        SupportMapFragment mMapFragment = ((SupportMapFragment) getActivity()
                .getSupportFragmentManager().findFragmentById(R.id.map));
        mMap = mMapFragment.getExtendedMap();
        mMap.getUiSettings().setMyLocationButtonEnabled(true);
}
}

所以,我希望能够创建/使用 MapFragment 两次以上。有什么建议/解决方法吗?

编辑:

public void showFragment(Fragment fragment) {
    FragmentTransaction transaction = getSupportFragmentManager()
            .beginTransaction().add(android.R.id.content, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

【问题讨论】:

  • 您是否正在寻找表现完全相同的两张地图?如果我在一张地图中滚动,另一张地图也应该滚动吗?
  • @gian1200 你为什么这么说,这样做完全没问题
  • 首先,要么正确使用嵌套片段(using getChildFragmentManager()),要么不使用嵌套片段(例如,子类SupportMapFragment,而不是包装它)。其次,永远不要自己调用生命周期方法,例如您在initGoogleMaps() 中进行的onCreate()onResume() 调用。如果这些都没有帮助,问题可能出在showFragment()。发布此方法的实现和完整的堆栈跟踪。
  • 谢谢。我调用了生命周期方法来测试另一个答案,你是对的。我编辑了我的问题并添加了 showFragment 方法。

标签: android google-maps android-fragments


【解决方案1】:

使用replace() 而不是add(),因为您在第二次调用showFragment() 时已经在android.R.id.content 中有一个片段。

您可能还需要将前一个事务从后台堆栈中弹出,或者摆脱addToBackStack() 调用。

【讨论】:

  • 谢谢,但不起作用。现在地图在第二次调用片段时没有显示:if (createNewEventFragment == null) createNewEventFragment = new CreateEventFragment(); FragmentTransaction transaction = getSupportFragmentManager() .beginTransaction().replace(android.R.id.content, createNewEventFragment); transaction.commit(); slidingMenu.showContent();
  • @CommonsWare ,我已经在使用 replace 函数但仍然出现重复 id 错误
【解决方案2】:

解决办法如下:

v = app.getMapLayout();
    if (v == null) {
        v = (View) inflater.inflate(R.layout.create_event, container, false);
        app.setMapLayout(v);
    } else {
        ViewGroup parent = (ViewGroup) v.getParent();
        parent.removeView(v);
    }

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多