0

Migration d'une MapActivity avec un SupportMapFragment statique dans la disposition vers des fragments dynamiques purs.SupportMapFragment imbriqué dans SupportFragment getMap() renvoie la valeur NULL

Le code ci-dessous est le fragment parent. Il contient une vue de contenu que je veux contenir un SupportMapFragment créé dynamiquement. Le contenu se trouve être un LinearLayout avec l'ID: map_container.

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")); 
    } 
} 

Le code ci-dessous est mon mapfragment personnalisé

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); 
    } 
} 

À la ligne environ 17 de mon fragment qui contient la carte, je reçois un pointeur NULL. Puisque le code fonctionne dans la méthode onactivitycreated() de mon MapFragment actuel, la carte ne doit pas être prête par la ligne 17 dans la méthode onviewcreated.

+1

Essayez d'insérer une méthode dans MapFragment qui crée un marqueur et appelez cette méthode à partir du fragment parent. –

+0

n'a pas aidé. Merci quand même –

+1

Avez-vous déjà entendu parler de la méthode getMapAsync()? –

Répondre

0

La solution consistait à mettre tout ce qui se rapportait au fragment Parent dans un gestionnaire avec un léger retard.

Intéressé à en apprendre davantage sur le cycle de vie et où un bon endroit pour commencer les boucles principales et les auditeurs en fragments. Je suppose que je dois juste me méfier du fil de l'interface utilisateur.

+0

Il existe de meilleures solutions, l'une d'entre elles consiste à utiliser la dernière API du service Google Play avec un meilleur design. –

+0

J'ai créé un repo pour plusieurs scénarios: https://github.com/eneim/Google_Map_Practice Voir si cela vous donne meilleure façon. –

+0

Merci. Je vais jeter un coup d'oeil. J'ai déjà résolu mon problème mais je regarde votre projet maintenant. –