27 votes

Comment savoir si la carte est prête à être utilisée lors de l'utilisation de SupportMapFragment?

Dans l' onCreate méthode, j'ai fait l'utilisation de l' SupportMapFragment de montrer une carte.

    SupportMapFragment fragment = new SupportMapFragment();
    getSupportFragmentManager().beginTransaction()
            .add(android.R.id.content, fragment).commit();

En parallèle à cela, je voudrais ajouter un marqueur. Le problème est lors de l'appel à getMap est nulle, quand puis-je essayer de nouveau? Il y a un événement que je peux vous inscrire, ou est mon approche en elle-même mal?

    mMap = ((SupportMapFragment)(getSupportFragmentManager().findFragmentById(R.id.map))).getMap();
    if(mMap == null)
        //what do I do here?

La carte est en fait un affichage sur le téléphone, mais je semble avoir aucune chance dans l'obtention de la référence à ajouter des marqueurs.

Mise à JOUR:

La raison que j'ai de la création de l' SupportMapFragment par le constructeur est parce que les typiques setContentView a été s'écraser et ne fonctionne pas. Cela m'a mis dans la situation où je ne pouvais pas obtenir ma référence en onCreate méthode depuis que je suis en fait la création de l' SupportMapFragment à l'époque. Dans la poursuite de l'enquête, il s'avère que mes setContentView question était un sous-produit de ne pas avoir à la fois la Google-play-services bocal ET le module/src partie de l'ensemble du projet. Sur faire les DEUX, setContentView fonctionne maintenant et je peux obtenir la référence par l'intermédiaire d' getMap() que je m'attends.

lots.xml...

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/map"
          android:name="com.google.android.gms.maps.SupportMapFragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />

LotsActivity.java...

public class LotsActivity extends FragmentActivity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lots);

        GoogleMap mMap;
        mMap = ((SupportMapFragment)(getSupportFragmentManager().findFragmentById(R.id.map))).getMap();
        if(mMap == null)
            //this should not occur now
    }

31voto

CommonsWare Points 402670

Le problème est lors de l'appel à getMap est nulle, quand puis-je essayer de nouveau?

Cela dépend de la nature du problème.

Si vous avez configuré l' SupportMapFragment via l' <fragment> élément dans la mise en page, vous pouvez appeler getMap() de succès en onCreate(). Mais, si vous créez l' SupportMapFragment via le constructeur, c'est trop tôt -- l' GoogleMap n'existe pas encore. Vous pouvez étendre SupportMapFragment et remplacer onActivityCreated(), comme getMap() est prêt d'ici là.

Toutefois, getMap() peut également renvoyer null pour un problème encore plus gros, tels que les Google Play Services n'est pas installé. Vous devez utiliser quelque chose comme GooglePlayServicesUtil.isGooglePlayServicesAvailable() pour détecter cette condition et de traiter avec elle comme vous le désirez.

14voto

strangeluck Points 466

J'ai fini par l'extension de la SupportMapFragment classe et à l'aide d'une fonction de rappel. Le code est ici:

public class MySupportMapFragment extends SupportMapFragment {

public MapViewCreatedListener itsMapViewCreatedListener;

// Callback for results

public abstract static class MapViewCreatedListener {
    public abstract void onMapCreated();
}

@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = super.onCreateView(inflater, container, savedInstanceState);
    // Notify the view has been created
    if( itsMapViewCreatedListener != null ) {
        itsMapViewCreatedListener.onMapCreated();
    }
    return view;
}
}

Je préférerais avoir utilisé une interface et de remplacer les onAttach(activité) de la méthode, mais dans mon cas, je ne voulais pas le rappel pour revenir à mon MainActivity. Je voulais revenir à un exemple de Fragment. (La GoogleMap était essentiellement un fragment à l'intérieur d'un fragment) - je configurer le rappel, et par programme chargé à la carte avec cette. Je voudrais avoir mis itsMapViewCreatedListener à l'intérieur du constructeur de MySupportMapFragment, mais en utilisant rien d'autre que sans paramètre constructeurs est découragé.

itsMySupportMapFragment = new MySupportMapFragment();
MapViewCreatedListener mapViewCreatedListener = new MapViewCreatedListener() {
    @Override
    public void onMapCreated() {
        initPlacesGoogleMapCtrl();
    }
};
itsMySupportMapFragment.itsMapViewCreatedListener = mapViewCreatedListener;
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.mapFragmentContainer, itsMySupportMapFragment);
transaction.addToBackStack(null);
transaction.commit();

Et puis, quand j'ai reçu l'appel de retour, j'ai pu obtenir la carte; pas plus nul!

public void initPlacesGoogleMapCtrl() {
    // Map ready, get it.
    GoogleMap googleMap = itsMySupportMapFragment.getMap();
    // Do what you want...
}

11voto

hordurh Points 91

Je voudrais commenter CommonsWare de la réponse, mais je n'ai pas assez de rep pour que. De toute façon, j'étais aussi à avoir ce problème que getMap() serait de retourner la valeur null dans onActivityCreated. Ma configuration est: est-ce que j'ai MainActivity qui contient un fragment. Dans le onCreateView méthode de ce fragment, j'ai créé le SupportMapFragment puis de l'ajouter à la fragment via le childFragmentManager. J'ai gardé la référence à la SupportMapFragment et il devrait me donner la carte dans onActivityCreated qui n'est pas. La solution à ce problème est de remplacer la onActivityCreated de la SupportMapFragment mais pas le parent fragment. J'ai fait comme ceci onCreateView:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_location, container, false);
    mMapFragment = new SupportMapFragment() {
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            mMap = mMapFragment.getMap();
            if (mMap != null) {
                setupMap();
            }
        }
    };
    getChildFragmentManager().beginTransaction().add(R.id.framelayout_location_container, mMapFragment).commit();
return v;   
}

0voto

theelfismike Points 1158

Vous pouvez également utiliser MapsInitializer.initialize(context); si le problème est lié au fait que les bibliothèques ne sont pas initialisées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X