嵌套在SupportFragment中的SupportMapFragment getMap()返回NULL



从布局中带有静态SupportMapFragment的MapActivity迁移到纯动态片段。

下面的代码是父片段。它包含一个内容视图,我希望它包含一个动态创建的SupportMapFragment。内容恰好是一个id为:map_container的LinearLayout。

    public class MapFragment extends android.support.v4.app.Fragment {
    private final LatLng NotHamburg = new LatLng(41.8236, -71.4222);
    protected GoogleMap _MAP;
    CustomMapFragment mapFragment;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_map, container, false);
        mapFragment = new CustomMapFragment();
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.add(R.id.map_container, mapFragment).commit();
        newMarker();
        return rootView;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }

       //oh, user wants to see a new marker or remove some from inside the main fragment? Lets try...
    public void newMarker(){
        _MAP = mapFragment.getMap();
        _MAP.addMarker(new MarkerOptions().position(NotHamburg).title("NOTHamburg"));
    }   
}
下面的代码是我的自定义mapfragment
public class CustomMapFragment extends com.google.android.gms.maps.SupportMapFragment {

private final LatLng HAMBURG = new LatLng(40.8236, -71.4222);
private GoogleMap googleMap;
public static CustomMapFragment newInstance() {
    CustomMapFragment fragment = new CustomMapFragment();
    return fragment;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    googleMap = getMap();
    if (googleMap != null) {
        googleMap.addMarker(new MarkerOptions().position(HAMBURG).title("Hamburg"));
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15));
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
    }
}

在包含映射的片段的大约第17行,我得到一个空指针。因为代码是在我实际的MapFragment的onactivitycreated()方法中工作的,所以映射必须在onviewcreated方法的第17行之前准备好。

解决方案是将任何与Parent片段相关的map放到具有小延迟的处理程序中。

有兴趣了解更多关于生命周期的知识,以及在哪里开始片段中的主循环和侦听器。我想我需要更加小心UI线程之类的东西。

最新更新