Android Google Maps V2:当地图作为动态片段包含时,添加的标记不会出现

Android Google Maps V2: added marker doesn't appear when map is included as dynamic fragment

我需要将地图动态添加到我的 MainActivity 应用程序中,否则我会以某种方式遭受内存泄漏。添加地图基本上可以,但我无法添加标记。他们只是不出现。这就是我添加地图的方式:

activity_main.xml 由 MainActivity

使用
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <!-- Placeholder for all fragments -->
    <RelativeLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

    </RelativeLayout>

    <!-- Slider menu -->
    <LinearLayout
        android:id="@+id/list_container"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#fff"
        android:orientation="vertical" >

    <!-- more code -->
    </LinearLayout>

</android.support.v4.widget.DrawerLayout>

fragment_map.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center" >

        <fragment
            xmlns:map="http://schemas.android.com/apk/res-auto"
            android:id="@+id/fragment_googlemap"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            class="com.androidmapsextensions.SupportMapFragment"
            map:cameraTargetLat="48.21167860510698"
            map:cameraTargetLng="16.365892895859423"
            map:cameraZoom="11"
            map:uiCompass="true"
            map:uiRotateGestures="true"
            map:uiScrollGestures="true"
            map:uiTiltGestures="true"
            map:uiZoomControls="true"
            map:uiZoomGestures="true" />
</FrameLayout>

MapFragment.java

public class MapFragment extends com.androidmapsextensions.SupportMapFragment
{
    private static final String TAG = MapFragment.class.getSimpleName();
    private OnFragmentLoadedCompleteListener onFragmentLoadedCompleteListener;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle args)
    {
        super.onCreateView(inflater, container, args);

        Logger.log(TAG, "onCreateView()", LogController.isLoggingEnabled(), Log.DEBUG);

        return inflater.inflate(R.layout.fragment_map, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);

        Logger.log(TAG, "onActivityCreated()", LogController.isLoggingEnabled(), Log.DEBUG);

        onFragmentLoadedCompleteListener.onFragmentComplete();
    }

    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);

        Logger.log(TAG, "onAttach()", LogController.isLoggingEnabled(), Log.DEBUG);

        onFragmentLoadedCompleteListener = (OnFragmentLoadedCompleteListener)activity;
    }
}

MainActivity.java

的重要部分
@Override
public void onFragmentComplete()
{
    googleMap = ((SupportMapFragment)getSupportFragmentManager().findFragmentByTag("mapFragment")).getExtendedMap();
}


private void initMapFragment()
{
    if (googleMap != null)
    {
        googleMap.clear();
        googleMap = null;
    }

    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MapFragment(), "mapFragment").commit();
}

OnFragmentLoadedCompleteListener.java

public interface OnFragmentLoadedCompleteListener
{
    public void onFragmentComplete();
}

onFragmentComplete() 已执行,googleMap 不为空并显示。但我不能在上面画标记。他们只是不出现。

但是当我没有像这样动态添加地图并将其嵌入到 RelativeLayout 中的 activity_main.xml 时

<RelativeLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <fragment
            xmlns:map="http://schemas.android.com/apk/res-auto"
            android:id="@+id/fragment_googlemap"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            class="com.androidmapsextensions.SupportMapFragment"
            map:cameraTargetLat="48.21167860510698"
            map:cameraTargetLng="16.365892895859423"
            map:cameraZoom="11"
            map:uiCompass="true"
            map:uiRotateGestures="true"
            map:uiScrollGestures="true"
            map:uiTiltGestures="true"
            map:uiZoomControls="true"
            map:uiZoomGestures="true" />
    </RelativeLayout>

并在没有监听器的情况下像这样获取地图,我可以绘制标记,这意味着它们出现了。

googleMap = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_googlemap)).getExtendedMap();

这意味着只有当我直接将地图嵌入到 MainActivity 的 xml 中而不是将其作为片段动态添加时,才能在地图上绘制标记。这里发生了什么。哪里出错了?

通常情况下,我自己找到了解决方案。

我必须保留对我用来替换的 MapFragment 的引用:

mapFragment = new MapFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, mapFragment).commit();

在 onFragmentComplete() 中,我必须对此引用调用 getChildFragmentManager() 以获取 "correct" GoogleMap。

googleMap = ((SupportMapFragment)mapFragment.getChildFragmentManager().findFragmentById(R.id.fragment_googlemap)).getExtendedMap();

这次也可以通过id找到了(之前不行),现在可以在这张地图上画标记了。