Ajouter les limites de la carte pour éviter de glisser en dehors d'une certaine région
Mon application montre une carte et je veux que les utilisateurs ne peuvent pas glisser sur une certaine région.
Donc, je suis en train d'ajouter des limites, mais elle rend l'application crash.
Voici le code de travail:
public class MapViewer extends Activity implements OnInfoWindowClickListener {
private LatLng defaultLatLng = new LatLng(42.564241, 12.22759);
private GoogleMap map;
private int zoomLevel = 5;
private Database db = new Database(this);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapviewer);
try {
map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
if (map != null) {
map.setMyLocationEnabled(true);
map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
map.getUiSettings().setRotateGesturesEnabled(false);
map.moveCamera(CameraUpdateFactory.newLatLngZoom(defaultLatLng, zoomLevel));
this.addMerchantMarkers(new MarkerOptions());
map.setOnInfoWindowClickListener(this);
}
} catch (NullPointerException e) {
e.printStackTrace();
}
}
@Override
public void onPause() {
if (map != null) {
map.setMyLocationEnabled(false);
map.setTrafficEnabled(false);
}
super.onPause();
}
public void addMerchantMarkers(MarkerOptions mo) {
SQLiteDatabase dbRead = db.getReadableDatabase();
String[] columns = {"title", "addr", "lat", "lon"};
Cursor result = dbRead.query("merchants", columns, null, null, null, null, null);
while(result.moveToNext()) {
String merchant = result.getString(0);
String address = result.getString(1);
float lat = result.getFloat(2);
float lon = result.getFloat(3);
LatLng pos = new LatLng(lat, lon);
map.addMarker(mo.position(pos)
.title(merchant)
.snippet(address)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_50)));;
}
}
}
Et c'est le code que j'ai ajouter dans la méthode onCreate qui cause le crash:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
builder.include(new LatLng(47.09194444, 18.52166666));
builder.include(new LatLng(36.448311, 6.62555555));
LatLngBounds bounds = builder.build();
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, 30);
map.animateCamera(cu);
Voici le LogCat:
08-10 20:59:41.689: E/AndroidRuntime(6304): FATAL EXCEPTION: main
08-10 20:59:41.689: E/AndroidRuntime(6304): Process: com.example.myapp, PID: 6304
08-10 20:59:41.689: E/AndroidRuntime(6304): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapp/com.example.myapp.MapViewer}: java.lang.IllegalStateException: Error using newLatLngBounds(LatLngBounds, int): Map size can't be 0. Most likely, layout has not yet occured for the map view. Either wait until layout has occurred or use newLatLngBounds(LatLngBounds, int, int, int) which allows you to specify the map's dimensions.
08-10 20:59:41.689: E/AndroidRuntime(6304): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2215)
08-10 20:59:41.689: E/AndroidRuntime(6304): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2264)
08-10 20:59:41.689: E/AndroidRuntime(6304): at android.app.ActivityThread.access$800(ActivityThread.java:144)
08-10 20:59:41.689: E/AndroidRuntime(6304): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
08-10 20:59:41.689: E/AndroidRuntime(6304): at android.os.Handler.dispatchMessage(Handler.java:102)
08-10 20:59:41.689: E/AndroidRuntime(6304): at android.os.Looper.loop(Looper.java:136)
08-10 20:59:41.689: E/AndroidRuntime(6304): at android.app.ActivityThread.main(ActivityThread.java:5139)
08-10 20:59:41.689: E/AndroidRuntime(6304): at java.lang.reflect.Method.invokeNative(Native Method)
08-10 20:59:41.689: E/AndroidRuntime(6304): at java.lang.reflect.Method.invoke(Method.java:515)
08-10 20:59:41.689: E/AndroidRuntime(6304): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
08-10 20:59:41.689: E/AndroidRuntime(6304): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
08-10 20:59:41.689: E/AndroidRuntime(6304): at dalvik.system.NativeStart.main(Native Method)
08-10 20:59:41.689: E/AndroidRuntime(6304): Caused by: java.lang.IllegalStateException: Error using newLatLngBounds(LatLngBounds, int): Map size can't be 0. Most likely, layout has not yet occured for the map view. Either wait until layout has occurred or use newLatLngBounds(LatLngBounds, int, int, int) which allows you to specify the map's dimensions.
08-10 20:59:41.689: E/AndroidRuntime(6304): at mut.b(Unknown Source)
08-10 20:59:41.689: E/AndroidRuntime(6304): at oxp.a(Unknown Source)
08-10 20:59:41.689: E/AndroidRuntime(6304): at oxi.a(Unknown Source)
08-10 20:59:41.689: E/AndroidRuntime(6304): at oyf.b(Unknown Source)
08-10 20:59:41.689: E/AndroidRuntime(6304): at grl.onTransact(SourceFile:92)
08-10 20:59:41.689: E/AndroidRuntime(6304): at android.os.Binder.transact(Binder.java:361)
08-10 20:59:41.689: E/AndroidRuntime(6304): at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.animateCamera(Unknown Source)
08-10 20:59:41.689: E/AndroidRuntime(6304): at com.google.android.gms.maps.GoogleMap.animateCamera(Unknown Source)
08-10 20:59:41.689: E/AndroidRuntime(6304): at com.example.myapp.MapViewer.onCreate(MapViewer.java:59)
08-10 20:59:41.689: E/AndroidRuntime(6304): at android.app.Activity.performCreate(Activity.java:5231)
08-10 20:59:41.689: E/AndroidRuntime(6304): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
08-10 20:59:41.689: E/AndroidRuntime(6304): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)
08-10 20:59:41.689: E/AndroidRuntime(6304): ... 11 more
- post le stacktrace
- Fait, j'ai édité mon post, merci.
- Erreur à l'aide de newLatLngBounds(LatLngBounds, int): taille de la Carte ne peut pas être 0. Le plus probable, la mise en page n'a pas encore eu lieu pour l'affichage de la carte. Soit attendre jusqu'à ce que la disposition a eu lieu ou de l'utilisation newLatLngBounds(LatLngBounds, int, int, int) qui vous permet de spécifier la carte de dimensions. On dirait que votre carte n'est pas prêt. Vérifiez également que les google play services de disponibilité.
- J'ai utilisé newLatLngBounds(limites, 30, 10, 10) et il ne plante pas, mais la carte ne reflète pas les limites que j'ai défini. En plus je ne sais pas comment utiliser ces 3 valeurs int 🙁
- Qu'est-ce que
MapViewer.java
ligne 59. - À la ligne 59 il y a la carte.animateCamera(cu);
- Laissez-nous continuer cette discussion dans le chat.
- vérifiez la réponse maintenant
- marquer une réponse correcte en fonction de votre problème ou de la communauté voix.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser MapLoadedCallBack;
et également vous pouvez utiliser cet événement qui se produit prier ci-dessus.
moveCamera
dansonMapLoaded
. Je pense que la carte est chargé, mais sur certains appareils, il peut ne pas être entièrement relooké. Donc, en mettanthandler.post
à l'intérieur deonMapLoaded
a aidé beaucoup. Mais nous voyons toujours de l'accident, même si elle est inférieure.Vous pouvez garder que l'erreur se produise en suivant les conseils du journal:
"...l'utilisation newLatLngBounds(LatLngBounds, int, int, int) qui vous permet de spécifier la carte de dimensions."
Les paramètres supplémentaires sont la largeur et la hauteur de votre écran. Voici comment la mise à jour de votre code ressemblerait à:
animateCamera
oumoveCamera
travail, sans exception, avant une mise en page a été montré?int width = getResources().getDisplayMetrics().widthPixels;
cela signifie que vous obtenez la dimension de l'écran que la mise en page de la Carte, mais la carte pourrait couvrir, disons, 10% de l'écran et il peut être aligné sur le coin supérieur droit de l'écran, pas au centre avecint padding = (int) (width * 0.12);
12% rembourrageDocumentation pour onMapReady() indique clairement que vous avez à attendre pour les deux onMapReadyCallback et ViewTreeObserver.OnGlobalLayoutListener:
C'est assez gênant, mais une façon de le faire, il serait en utilisant RxJava. Vous pourriez émettre deux observables, une première dans onMapReady et une seconde dans onGlobalLayout, puis zip ensemble et de faire tout ce que vous devez faire. De cette façon, vous pouvez être certain que les deux rappels ont été licenciés.
De la documentation https://developer.android.com/reference/com/google/android/gms/maps/CameraUpdateFactory.html#newLatLngBounds(com.google.android.gms.maps.model.LatLngBounds, int)
Remarque:
getMap()
peut retourner null. Il est préférable de vérifier la Disponibilité de Google play services avant d'initialiser GoogleMap objet.La raison de cette erreur est parce que la présentation de la Carte n'a pas été complété, Vous devez mettre en œuvre OnMapReadyCallback dans vos appels, ce qui fera en sorte que votre code ne fonctionnera qu'après votre mise en page est terminée ou les mettre en dessous de rappel
Liens En Double
moveCamera avec CameraUpdateFactory.newLatLngBounds se bloque
IllegalStateException taille de la carte ne doit pas être 0
Je ne suis pas si il y a un moyen de fusionner ce lien. J'Espère que j'ai aidé
Cela a fonctionné pour moi:
J'ai créé un moyen de combiner les deux rappels: onMapReady et onGlobalLayout en un seul observable qui émettent uniquement lorsque les deux événements ont été déclenchés.
https://gist.github.com/abhaysood/e275b3d0937f297980d14b439a8e0d4a
Lieu à l'appel au sein d'un exécutable, et l'afficher à la vue du gestionnaire, comme suit:
Lorsque le point de vue a été aménagé l'exécutable s'exécute et positionner correctement la carte. Le problème avec ahmadalibalochs réponse, c'est que vous verrez un flash de la planète avant de correctement se positionne. L'affichage à la vue gestionnaire, résout ce problème.
La réponse est marquée correct n'est pas 100% correct. Je pense que cela peut encore échouer dans le cas où la carte ne se charge jamais en raison de la connectivité, ou si la carte est mise à jour si rapidement qu'il n'a jamais totalement finit de se charger.
J'ai utilisé le addOnGlobalLayoutListener.