問題は、それがアイテム数が0の時にも起こるので、アイテム数が0の時に画面にタッチするとNullPointerExceptionが発生すること。
10-26 12:00:24.607: ERROR/AndroidRuntime(2753): java.lang.NullPointerException 10-26 12:00:24.607: ERROR/AndroidRuntime(2753): at com.google.android.maps.ItemizedOverlay.getItemsAtLocation(ItemizedOverlay.java:617) 10-26 12:00:24.607: ERROR/AndroidRuntime(2753): at com.google.android.maps.ItemizedOverlay.getItemAtLocation(ItemizedOverlay.java:586) 10-26 12:00:24.607: ERROR/AndroidRuntime(2753): at com.google.android.maps.ItemizedOverlay.handleMotionEvent(ItemizedOverlay.java:498) 10-26 12:00:24.607: ERROR/AndroidRuntime(2753): at com.google.android.maps.ItemizedOverlay.onTouchEvent(ItemizedOverlay.java:572) 10-26 12:00:24.607: ERROR/AndroidRuntime(2753): at hoge.MapDemo.GeoItemizedOverlay.onTouchEvent(GeoItemizedOverlay.java:54) 10-26 12:00:24.607: ERROR/AndroidRuntime(2753): at com.google.android.maps.OverlayBundle.onTouchEvent(OverlayBundle.java:63) 10-26 12:00:24.607: ERROR/AndroidRuntime(2753): at com.google.android.maps.MapView.onTouchEvent(MapView.java:625) 10-26 12:00:24.607: ERROR/AndroidRuntime(2753): at hoge.MapDemo.CustomizedMapView.onTouchEvent(CustomizedMapView.java:52)
今の所この現象を避けるには、ItemizedOverlayを継承したクラスのコンストラクタで、super(boundCenterBottom(defaultMarker));の後で、populate()を呼ぶこと。
・ItemizedOverlayを使うときは、必ずコンストラクタ内でpopulate()を呼ぶ
populate()はアイテムを追加した後に必ず呼ぶメソッドだが、アイテムがあろうがなかろうが、最初からコールしておくということ。これでNullPointerExceptionは発生しなくなる。
public class GeoItemizedOverlay extends ItemizedOverlay<OverlayItem> { private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); private Context mContext; public GeoItemizedOverlay(Drawable defaultMarker, Context context) { super(boundCenterBottom(defaultMarker)); mContext = context; populate();//これが大事! } }
このバグはIssueとして管理されているので、早めに解決して欲しい方はvoteしてください。
Issue 2035 - android - NullPointerException when scrolling through a MapView with an ItemizedOverlay with no OverlayItems - Project Hosting on Google Code
0 件のコメント :
コメントを投稿