Android,允许用户在地图上绘制折线
Android, Allow user to draw polyline on map
我努力让用户在触摸地图时在地图上绘制折线,我不知道哪里出错了,我认为问题出在 onMapTouch 方法上,因为地图显示正常,但当我触摸地图时它说"Unfortunately application has stopped working",你怎么想,这里是logcat:
17319-17319/? E/AndroidRuntime:致命异常:main
进程:com.example.sarahn.myapplication,PID:17319
java.lang.IllegalArgumentException: 标记选项中没有位置
在 com.google.l.a.ce.a(来源不明)
在 com.google.maps.api.android.lib6.d.ft.a(来源不明)
在 com.google.android.gms.maps.internal.l.onTransact(源文件:167)
在 android.os.Binder.transact(Binder.java:380)
在 com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.addMarker(未知来源)
在 com.google.android.gms.maps.GoogleMap.addMarker(来源不明)
在 com.example.sarahn.myapplication.MapsActivity.onMapClick(MapsActivity.java:91)
在 com.google.android.gms.maps.GoogleMap$8.onMapClick(来源不明)
在 com.google.android.gms.maps.internal.zzj$zza.onTransact(来源不明)
在 android.os.Binder.transact(Binder.java:380)
在 com.google.android.gms.maps.internal.ar.a(源文件:93)
在 com.google.maps.api.android.lib6.gmm6.c.ac.b(未知来源)
在 com.google.maps.api.android.lib6.gmm6.n.bt.d(未知来源)
在 com.google.maps.api.android.lib6.gmm6.n.ak.onSingleTapConfirmed(未知来源)
在 com.google.maps.api.android.lib6.gmm6.h.g.onSingleTapConfirmed(未知来源)
在 com.google.maps.api.android.lib6.gmm6.h.i.handleMessage(未知来源)
在 android.os.Handler.dispatchMessage(Handler.java:102)
在 android.os.Looper.loop(Looper.java:211)
在 android.app.ActivityThread.main(ActivityThread.java:5317)
在 java.lang.reflect.Method.invoke(本机方法)
在 java.lang.reflect.Method.invoke(Method.java:372)
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
public class MapsActivity extends FragmentActivit implementsGoogleMap.OnMapClickListener{
private GoogleMap mMap;
ArrayList<LatLng> arrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
setUpMapIfNeeded();
arrayList = new ArrayList<LatLng>();
SupportMapFragment f = (SupportMapFragmen) getSupportFragmentManager().findFragmentById(R.id.map);
mMap= f.getMap();
mMap.setMyLocationEnabled(true);
mMap.setOnMapClickListener(this);
}
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
}
public void onMapClick(LatLng latLng) {
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng);
mMap.addMarker(markerOptions);
PolylineOptions p = new PolylineOptions();
p.color(Color.RED);
p.width(5);
arrayList.add(latLng);
p.addAll(arrayList);
mMap.addPolyline(new PolylineOptions());
mMap.addMarker(new MarkerOptions());
}
这可能与以下事实有关:MarkerOptions 的 position 方法 returns 您要设置位置的对象。
尝试:
MarkerOptions markerOptions = new MarkerOptions();
markerOptions = markerOptions.position(latLng);
编辑:
上面我错了。就是因为这行代码:
mMap.addMarker(new MarkerOptions());
您正在地图上添加一个没有位置的新标记。在尝试添加到地图之前,您需要设置标记的位置。我不确定为什么要在地图上添加第二个标记,因为您已经在用户的触摸位置添加了标记。您还试图在地图上添加一条没有属性的多段线。
试试这个,看看会发生什么:
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng);
mMap.addMarker(markerOptions);
PolylineOptions p = new PolylineOptions();
p.color(Color.RED);
p.width(5);
arrayList.add(latLng);
p.addAll(arrayList);
mMap.addPolyline(p);
我努力让用户在触摸地图时在地图上绘制折线,我不知道哪里出错了,我认为问题出在 onMapTouch 方法上,因为地图显示正常,但当我触摸地图时它说"Unfortunately application has stopped working",你怎么想,这里是logcat:
17319-17319/? E/AndroidRuntime:致命异常:main 进程:com.example.sarahn.myapplication,PID:17319 java.lang.IllegalArgumentException: 标记选项中没有位置 在 com.google.l.a.ce.a(来源不明) 在 com.google.maps.api.android.lib6.d.ft.a(来源不明) 在 com.google.android.gms.maps.internal.l.onTransact(源文件:167) 在 android.os.Binder.transact(Binder.java:380) 在 com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.addMarker(未知来源) 在 com.google.android.gms.maps.GoogleMap.addMarker(来源不明) 在 com.example.sarahn.myapplication.MapsActivity.onMapClick(MapsActivity.java:91) 在 com.google.android.gms.maps.GoogleMap$8.onMapClick(来源不明) 在 com.google.android.gms.maps.internal.zzj$zza.onTransact(来源不明) 在 android.os.Binder.transact(Binder.java:380) 在 com.google.android.gms.maps.internal.ar.a(源文件:93) 在 com.google.maps.api.android.lib6.gmm6.c.ac.b(未知来源) 在 com.google.maps.api.android.lib6.gmm6.n.bt.d(未知来源) 在 com.google.maps.api.android.lib6.gmm6.n.ak.onSingleTapConfirmed(未知来源) 在 com.google.maps.api.android.lib6.gmm6.h.g.onSingleTapConfirmed(未知来源) 在 com.google.maps.api.android.lib6.gmm6.h.i.handleMessage(未知来源) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:211) 在 android.app.ActivityThread.main(ActivityThread.java:5317) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
public class MapsActivity extends FragmentActivit implementsGoogleMap.OnMapClickListener{
private GoogleMap mMap;
ArrayList<LatLng> arrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
setUpMapIfNeeded();
arrayList = new ArrayList<LatLng>();
SupportMapFragment f = (SupportMapFragmen) getSupportFragmentManager().findFragmentById(R.id.map);
mMap= f.getMap();
mMap.setMyLocationEnabled(true);
mMap.setOnMapClickListener(this);
}
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
}
public void onMapClick(LatLng latLng) {
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng);
mMap.addMarker(markerOptions);
PolylineOptions p = new PolylineOptions();
p.color(Color.RED);
p.width(5);
arrayList.add(latLng);
p.addAll(arrayList);
mMap.addPolyline(new PolylineOptions());
mMap.addMarker(new MarkerOptions());
}
这可能与以下事实有关:MarkerOptions 的 position 方法 returns 您要设置位置的对象。
尝试:
MarkerOptions markerOptions = new MarkerOptions();
markerOptions = markerOptions.position(latLng);
编辑:
上面我错了。就是因为这行代码:
mMap.addMarker(new MarkerOptions());
您正在地图上添加一个没有位置的新标记。在尝试添加到地图之前,您需要设置标记的位置。我不确定为什么要在地图上添加第二个标记,因为您已经在用户的触摸位置添加了标记。您还试图在地图上添加一条没有属性的多段线。
试试这个,看看会发生什么:
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng);
mMap.addMarker(markerOptions);
PolylineOptions p = new PolylineOptions();
p.color(Color.RED);
p.width(5);
arrayList.add(latLng);
p.addAll(arrayList);
mMap.addPolyline(p);