안드로이드 개발 질문/답변
(글 수 45,052)
지금 버튼 클릭시마다 현재의 위치값을 저장하고 오버레이 추가하는 작업을 하는데요,
문제는 이작업에서 추가한 오버레이를 2번 연속으로 삭제를 해줄때 위와같은 인덱스초과 에러가 뜨더라구요
로그값찍어보면 탭 누른시점에서 제대로 인덱스랑 어레이 크기가 제대로 찍히는데 꼭 2번째 삭제때는 얼럴트가 안뜨고 그냥 익셉션이 발생되버리더라구요,, 이거로 몇일째 진도를 못나가네요.ㅠㅠㅠ
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): java.lang.ArrayIndexOutOfBoundsException
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.ItemizedOverlay.maskHelper(ItemizedOverlay.java:562)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.ItemizedOverlay.setFocus(ItemizedOverlay.java:365)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.ItemizedOverlay.focus(ItemizedOverlay.java:539)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.ItemizedOverlay.onTap(ItemizedOverlay.java:455)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.OverlayBundle.onTap(OverlayBundle.java:83)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.MapView$1.onSingleTapUp(MapView.java:347)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.GestureDetector.onTouchEvent(GestureDetector.java:533)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.MapView.onTouchEvent(MapView.java:647)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.View.dispatchTouchEvent(View.java:3844)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1745)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1137)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1729)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1745)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1137)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1729)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.os.Handler.dispatchMessage(Handler.java:99)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.os.Looper.loop(Looper.java:123)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.app.ActivityThread.main(ActivityThread.java:4627)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at java.lang.reflect.Method.invokeNative(Native Method)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at java.lang.reflect.Method.invoke(Method.java:521)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at dalvik.system.NativeStart.main(Native Method)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.ItemizedOverlay.maskHelper(ItemizedOverlay.java:562)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.ItemizedOverlay.setFocus(ItemizedOverlay.java:365)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.ItemizedOverlay.focus(ItemizedOverlay.java:539)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.ItemizedOverlay.onTap(ItemizedOverlay.java:455)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.OverlayBundle.onTap(OverlayBundle.java:83)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.MapView$1.onSingleTapUp(MapView.java:347)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.GestureDetector.onTouchEvent(GestureDetector.java:533)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.google.android.maps.MapView.onTouchEvent(MapView.java:647)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.View.dispatchTouchEvent(View.java:3844)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1745)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1137)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1729)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1745)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1137)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1729)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.os.Handler.dispatchMessage(Handler.java:99)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.os.Looper.loop(Looper.java:123)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at android.app.ActivityThread.main(ActivityThread.java:4627)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at java.lang.reflect.Method.invokeNative(Native Method)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at java.lang.reflect.Method.invoke(Method.java:521)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
03-09 02:38:01.183: ERROR/AndroidRuntime(14977): at dalvik.system.NativeStart.main(Native Method)
///////////////////////////////////////////////////////
package pac.ssu.Hendel;
public class MakeBread extends MapActivity {
private static List<Overlay> overlay;
OverlayItem overlayitem;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.makebread);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.pic01);
bitmap = Bitmap.createScaledBitmap(bitmap, 50, 50, false);
Drawable marker = new BitmapDrawable(bitmap);
overlayItems = new OverlayItems(marker);
// 맵 속성 설정 생략
// 맵 속성 설정 생략
tv = (TextView) findViewById(R.id.show);
Button addBtn = (Button) findViewById(R.id.addLoc);
addBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
locationManager.requestLocationUpdates(provider, 0, 0,
locationListener);
}
});
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
Button addBtn = (Button) findViewById(R.id.addLoc);
addBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
locationManager.requestLocationUpdates(provider, 0, 0,
locationListener);
}
});
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
private final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
if (location != null /* && !lastLoc.equals(location)*/) {
Toast.makeText(mContext, "좌표값을 저장하였습니다.", Toast.LENGTH_SHORT).show();
updateWithNewLocation(location);
locationManager.removeUpdates(locationListener);
}
else if(lastLoc.equals(location))
{
}
lastLoc = location;
}
public void onLocationChanged(Location location) {
if (location != null /* && !lastLoc.equals(location)*/) {
Toast.makeText(mContext, "좌표값을 저장하였습니다.", Toast.LENGTH_SHORT).show();
updateWithNewLocation(location);
locationManager.removeUpdates(locationListener);
}
else if(lastLoc.equals(location))
{
}
lastLoc = location;
}
public void onProviderDisabled(String provider) {
updateWithNewLocation(null);
Toast.makeText(mContext, "좌표값을 불러오는데 실패하였습니다.", Toast.LENGTH_LONG).show();
}
updateWithNewLocation(null);
Toast.makeText(mContext, "좌표값을 불러오는데 실패하였습니다.", Toast.LENGTH_LONG).show();
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};
};
private void updateWithNewLocation(Location location) {
if (location != null) {
//오버레이 추가부분
overlay = mapView.getOverlays();
overlayitem = new OverlayItem(new GeoPoint(
(int) (location.getLatitude() * 1E6), (int) (location
.getLongitude() * 1E6)), "", "");
overlayItems.addOverlayItem(overlayitem);
overlay.add(overlayItems);
Double geoLat = location.getLatitude() * 1E6;
Double geoLng = location.getLongitude() * 1E6;
GeoPoint point = new GeoPoint(geoLat.intValue(), geoLng.intValue());
mapController.animateTo(point);
} else {
//오버레이 추가부분
overlay = mapView.getOverlays();
overlayitem = new OverlayItem(new GeoPoint(
(int) (location.getLatitude() * 1E6), (int) (location
.getLongitude() * 1E6)), "", "");
overlayItems.addOverlayItem(overlayitem);
overlay.add(overlayItems);
Double geoLat = location.getLatitude() * 1E6;
Double geoLng = location.getLongitude() * 1E6;
GeoPoint point = new GeoPoint(geoLat.intValue(), geoLng.intValue());
mapController.animateTo(point);
} else {
}
}
}
public class OverlayItems extends ItemizedOverlay<OverlayItem> {
private List<OverlayItem> items = new ArrayList<OverlayItem>();
public OverlayItems(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
}
public OverlayItems(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
}
@Override
public GeoPoint getCenter() {
Integer averageLat = 0;
Integer averageLon = 0;
for (GeoPoint point : ItemPoints) {
averageLat += point.getLatitudeE6();
averageLon += point.getLongitudeE6();
}
averageLat /= ItemPoints.length;
averageLon /= ItemPoints.length;
return new GeoPoint(averageLat, averageLon);
}
public GeoPoint getCenter() {
Integer averageLat = 0;
Integer averageLon = 0;
for (GeoPoint point : ItemPoints) {
averageLat += point.getLatitudeE6();
averageLon += point.getLongitudeE6();
}
averageLat /= ItemPoints.length;
averageLon /= ItemPoints.length;
return new GeoPoint(averageLat, averageLon);
}
@Override
protected OverlayItem createItem(int i) {
return items.get(i);
}
protected OverlayItem createItem(int i) {
return items.get(i);
}
@Override
public int size() {
return items.size();
}
public int size() {
return items.size();
}
public void mPopulate() {
populate();
}
populate();
}
@Override
protected boolean onTap(int index) {
final int idx = index;
//로그값 찍어보면 2번연속 삭제를 해줄때 2번째 오버레이 터치할때 이시점까지 오고 익셉션이 발생되버립니다,,,
protected boolean onTap(int index) {
final int idx = index;
//로그값 찍어보면 2번연속 삭제를 해줄때 2번째 오버레이 터치할때 이시점까지 오고 익셉션이 발생되버립니다,,,
items 어레이값이 크기나 현재 터치한 인덱스는 제대로 찍힌거 확인했구요, 그러니 더더욱 원인을 모르겟네요,
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setMessage("선택하신 빵을 삭제하시겠습니까?");
builder.setCancelable(false);
builder.setPositiveButton("확인",
new DialogInterface.OnClickListener() {
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
if (items.size() > 0) {
items.remove(idx);
populate();
}
dialog.cancel();
}
});
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
if (items.size() > 0) {
items.remove(idx);
populate();
}
dialog.cancel();
}
});
builder.setNegativeButton("취소",
new DialogInterface.OnClickListener() {
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.cancel();
}
});
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.cancel();
}
});
builder.show();
return true;
}
return true;
}
public void setLocation(Location location) {
this.location.add(location);
initLoc(this.location.size());
}
this.location.add(location);
initLoc(this.location.size());
}
public void addOverlayItem(OverlayItem overlay) {
items.add(overlay);
populate();
}
}
}
items.add(overlay);
populate();
}
}
}




이미 해결 하셨을지 모르겠지만 아래 링크 참고하세요~
http://developmentality.wordpress.com/2009/10/19/android-itemizedoverlay-arrayindexoutofboundsexception-nullpointerexception-workarounds/
저도 비슷한 문제로 검색하다가 찾았네요ㅋ
삭제할 때 setLastFocusedIndex 메소드를 호출해 줘서 LastFocusedIndex를 제대로 설정해주는 것이 포인트 인 것 같네요~