J'essaye d'ajouter un MapFragment à mon Fragment. L'utilisation d'imbrication des fragments est limité à FragmentTransactions, vous ne pouvez pas utiliser la balise xml dans votre mise en page.
Aussi, je veux qu'il soit ajouté à la principale Fragment lorsque l'utilisateur appuie sur un bouton. Donc, je suis de la création de la MapFragment par programme avec l' getInstance()
lorsque l'utilisateur appuie sur le bouton et en l'ajoutant à la bonne place. Il est indiqué correctement, c'est très bien.
Le problème est que, après fixation de la MapFragment j'ai besoin d'obtenir une référence à l' GoogleMap
pour placer un Marqueur, mais l' getMap()
méthode renvoie la valeur null (comme le fragment de la onCreateView()
n'a pas été appelée encore).
J'ai regardé la démo exemple de code et j'ai trouvé la solution qu'ils utilisent est l'initialisation de la MapFragment en onCreate()
et l'obtention de la référence à GoogleMap en onResume()
, après onCreateView()
a été appelé.
J'ai besoin de pour obtenir la référence à GoogleMap juste après la MapFragment d'initialisation, parce que je veux que les utilisateurs soient en mesure d'afficher ou de masquer la carte avec un bouton. Je connais une solution possible serait de créer de la Carte au début comme dit plus haut et il suffit de le mettre visibilité du parti, mais je tiens à la carte sera désactivée par défaut afin de ne pas prendre de l'utilisateur de la bande passante si elles ne sont pas explicitement demandé.
J'ai essayé avec l' MapsInitializer
, mais cela ne fonctionne pas. Je suis un peu coincé. Des idées?
Voici mon code de test pour l'instant:
public class ParadaInfoFragment extends BaseDBFragment {
// BaseDBFragment is just a SherlockFragment with custom utility methods.
private static final String MAP_FRAGMENT_TAG = "map";
private GoogleMap mMap;
private SupportMapFragment mMapFragment;
private TextView mToggleMapa;
private boolean isMapVisible = false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_parada_info, container, false);
mToggleMapa = (TextView) v.findViewById(R.id.parada_info_map_button);
return v;
}
@Override
public void onStart() {
super.onStart();
mToggleMapa.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isMapVisible) {
openMap();
} else {
closeMap();
}
isMapVisible = !isMapVisible;
}
});
}
private void openMap() {
// Creates initial configuration for the map
GoogleMapOptions options = new GoogleMapOptions().camera(CameraPosition.fromLatLngZoom(new LatLng(37.4005502611301, -5.98233461380005), 16))
.compassEnabled(false).mapType(GoogleMap.MAP_TYPE_NORMAL).rotateGesturesEnabled(false).scrollGesturesEnabled(false).tiltGesturesEnabled(false)
.zoomControlsEnabled(false).zoomGesturesEnabled(false);
// Modified from the sample code:
// It isn't possible to set a fragment's id programmatically so we set a
// tag instead and search for it using that.
mMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentByTag(MAP_FRAGMENT_TAG);
// We only create a fragment if it doesn't already exist.
if (mMapFragment == null) {
// To programmatically add the map, we first create a
// SupportMapFragment.
mMapFragment = SupportMapFragment.newInstance(options);
// Then we add it using a FragmentTransaction.
FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.parada_info_map_container, mMapFragment, MAP_FRAGMENT_TAG);
fragmentTransaction.commit();
}
// We can't be guaranteed that the map is available because Google Play
// services might not be available.
setUpMapIfNeeded(); //XXX Here, getMap() returns null so the Marker can't be added
// The map is shown with the previous options.
}
private void closeMap() {
FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
fragmentTransaction.remove(mMapFragment);
fragmentTransaction.commit();
}
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the
// map.
if (mMap == null) {
// Try to obtain the map from the SupportMapFragment.
mMap = mMapFragment.getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
mMap.addMarker(new MarkerOptions().position(new LatLng(37.4005502611301, -5.98233461380005)).title("Marker"));
}
}
}
}
Merci