在Android中使用逐项覆盖时为空指针
您好,我正在尝试使用逐项叠加在地图上绘制一组晶格度和经度。我收到以下错误。可能是什么问题 > 这是我的HelloItemizedOverlay课程在Android中使用逐项覆盖时为空指针,android,maps,itemizedoverlay,Android,Maps,Itemizedoverlay,您好,我正在尝试使用逐项叠加在地图上绘制一组晶格度和经度。我收到以下错误。可能是什么问题 > 这是我的HelloItemizedOverlay课程 package com.rahul.besttracker; import java.util.ArrayList; import android.app.AlertDialog; import android.content.Context; import android.graphics.drawable.Dr
package com.rahul.besttracker;
import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;
public class HelloItemizedOverlay extends ItemizedOverlay {
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
Context mContext;
public HelloItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
// TODO Auto-generated constructor stub
}
public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
super(boundCenterBottom(defaultMarker));
mContext = context;
}
@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
@Override
public int size() {
return mOverlays.size();
}
public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate(); <--------------GETTING ERROR HERE
}
@Override
protected boolean onTap(int index) {
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
}
package com.rahul.besttracker;
导入java.util.ArrayList;
导入android.app.AlertDialog;
导入android.content.Context;
导入android.graphics.drawable.drawable;
导入com.google.android.maps.ItemizedOverlay;
导入com.google.android.maps.OverlayItem;
公共类HelloItemizeOverlay扩展了ItemizeOverlay{
private ArrayList mOverlays=new ArrayList();
语境;
公共HelloItemizeOverlay(可绘制默认标记){
super(boundCenterBottom(defaultMarker));
//TODO自动生成的构造函数存根
}
公共HelloItemizeOverlay(可绘制的defaultMarker,上下文){
super(boundCenterBottom(defaultMarker));
mContext=上下文;
}
@凌驾
受保护的OverlayItem createItem(int i){
返回mOverlays.get(i);
}
@凌驾
公共整数大小(){
返回mOverlays.size();
}
公共void addOverlay(OverlayItem overlay){
添加(覆盖);
填充();0&&Lon[i]>0){
地质点=新的地质点((int)(纬度[i]*1E6),
(int)(Lon[i]*1E6));
overlayitem=新的overlayitem(point,mArrayList.get(i),null);
}
itemizedoverlay.addOverlay(overlayitem);
添加(itemizedoverlay);
}
}
@凌驾
受保护的布尔值isRouteDisplayed(){
//TODO自动生成的方法存根
返回false;
}
}在onCreate中的for循环中,如果不进入if语句,就永远不会实例化overlayitem,因此将添加指向overlay的空指针。这最终会导致崩溃。add应该是if的一部分。onCreate中的for循环仅在if语句内部为变量overlayitem设置有效值,但在if语句外部的if语句之后使用它。如果该条件为false,则表示overlayitem为null。但你还是把它作为一个标记添加到地图上。这将导致最终的空指针错误。
package com.rahul.besttracker;
import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;
public class HelloItemizedOverlay extends ItemizedOverlay {
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
Context mContext;
public HelloItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
// TODO Auto-generated constructor stub
}
public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
super(boundCenterBottom(defaultMarker));
mContext = context;
}
@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
@Override
public int size() {
return mOverlays.size();
}
public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate(); <--------------GETTING ERROR HERE
}
@Override
protected boolean onTap(int index) {
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
}
package com.rahul.besttracker;
import java.util.ArrayList;
import java.util.List;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
public class Mapview extends MapActivity {
MapView map;
ArrayList<String> mArrayList;
double[] Lat;
double[] Lon;
String stops[];
int latarr[], lonarr[];
OverlayItem overlayitem;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.maps);
map = (MapView) findViewById(R.id.Map);
// map.setBuiltInZoomControls(true);
// setContentView(R.layout.maps);
Bundle gotBasket = getIntent().getExtras();
mArrayList = gotBasket.getStringArrayList("stops");
Lat = gotBasket.getDoubleArray("Lat");
Lon = gotBasket.getDoubleArray("Lon");
System.out.println("SIZE+++" + Lat.length + " " + Lon.length);
for (int i = 0; i < mArrayList.size(); i++) {
System.out.println(" \n" + Lat[i] + "\t" + Lon[i]);
}
// stops=(String[]) mArrayList.toArray();
List<Overlay> mapOverlays = map.getOverlays();
Drawable drawable = this.getResources().getDrawable(
R.drawable.mark_blue);
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(
drawable, this);
for (int i = 0; i < mArrayList.size(); i++) {
if (Lat[i] > 0 && Lon[i] > 0) {
GeoPoint point = new GeoPoint((int) (Lat[i] * 1E6),
(int) (Lon[i] * 1E6));
overlayitem = new OverlayItem(point, mArrayList.get(i), null);
}
itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
}
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}