2010-07-23 52 views
5

Tôi hiện đang viết một ứng dụng hiển thị MapView hiển thị bản đồ google. tôi đã sử dụng hướng dẫn "xem bản đồ hello" từ http://developer.android.com/resources/tutorials/views/hello-mapview.html và công trình này cho đến nay: bản đồ được hiển thị, căn giữa và thu phóng chính xác, ngay cả OverlayItems i được thêm vào cũng được hiển thị chính xác.GoogleMaps MapView gặp sự cố khi bật trong Android?

Nhưng khi tôi click vào một trong những mặt hàng overlay i thêm, ứng dụng bị treo với một con trỏ ngoại lệ null:

07-23 16:24:48.167: ERROR/AndroidRuntime(2530): java.lang.NullPointerException 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at  com.android.internal.app.AlertController$AlertParams.<init>(AlertController.java:753) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.app.AlertDialog$Builder.<init>(AlertDialog.java:273) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at net.xenonite.wifiloc.act_map$MapItemizedOverlay.onTap(act_map.java:182) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.google.android.maps.ItemizedOverlay.onTap(ItemizedOverlay.java:453) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.google.android.maps.OverlayBundle.onTap(OverlayBundle.java:83) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.google.android.maps.MapView$1.onSingleTapUp(MapView.java:347) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.google.android.maps.GestureDetector.onTouchEvent(GestureDetector.java:533) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.google.android.maps.MapView.onTouchEvent(MapView.java:647) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.View.dispatchTouchEvent(View.java:3709) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:874) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1695) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.app.Activity.dispatchTouchEvent(Activity.java:2068) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1679) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1708) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.os.Looper.loop(Looper.java:123) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.app.ActivityThread.main(ActivityThread.java:4595) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at dalvik.system.NativeStart.main(Native Method) 

mã của tôi chủ yếu là sao chép từ hướng dẫn:

public class act_map extends MapActivity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.map); 

     intent = getIntent(); 
     lat = intent.getDoubleExtra("lat", 0.0); 
     lng = intent.getDoubleExtra("lng", 0.0); 

     MapView = (MapView) findViewById(R.id.act_map_mapview); 

     List<Overlay> mapOverlays = MapView.getOverlays(); 

     Drawable positionMarker 
      = getResources().getDrawable(R.drawable.act_map_androidmarker); 
     MapItemizedOverlay itemizedOverlay 
      = new MapItemizedOverlay(positionMarker); 

     geoPoint = new GeoPoint((int) (lat * 1000000), (int) (lng * 1000000)); 
     Pointer = new OverlayItem(geoPoint, "Thats me!", "wohooo"); 

     itemizedOverlay.addOverlay(Pointer); 

     mapOverlays.add(itemizedOverlay); 

     MapView.setSatellite(false); 

     MapController = MapView.getController(); 
     MapController.setCenter(geoPoint); 
     MapController.setZoom(18); 

     MapView.setBuiltInZoomControls(true); 
     MapView.displayZoomControls(true); 
    } 

    @Override 
    protected boolean isRouteDisplayed() 
    { 
     return false; 
    } 

    public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
     if (keyCode == KeyEvent.KEYCODE_I) 
     { 
      MapView.getController().setZoom(MapView.getZoomLevel() + 1); 
      return true; 
     } 
     else if (keyCode == KeyEvent.KEYCODE_O) 
     { 
      MapView.getController().setZoom(MapView.getZoomLevel() - 1); 
      return true; 
     } 
     else if (keyCode == KeyEvent.KEYCODE_S) 
     { 
      MapView.setSatellite(true); 
      return true; 
     } 
     else if (keyCode == KeyEvent.KEYCODE_M) 
     { 
      MapView.setSatellite(false); 
      return true; 
     } 

     return false; 
    } 

    public class MapItemizedOverlay extends ItemizedOverlay<OverlayItem> 
    { 
     private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 
     private Context mContext; 

     public MapItemizedOverlay(Drawable defaultMarker) 
     { 
      super(boundCenterBottom(defaultMarker)); 
     } 

     public MapItemizedOverlay(Drawable defaultMarker, Context context) 
     { 
      super(defaultMarker); 
      mContext = context; 
     } 

     public void addOverlay(OverlayItem overlay) 
     { 
      mOverlays.add(overlay); 
      populate(); 
     } 

     @Override 
     protected OverlayItem createItem(int i) 
     { 
      return mOverlays.get(i); 
     } 

     @Override 
     public int size() 
     { 
      return mOverlays.size(); 
     } 

     @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; 
     } 
    } 

thế nào tôi có sửa cái này không?

Trả lời

4

mContextnull. Vì lớp phủ của bạn là lớp bên trong của hoạt động, hãy thay thế mContext bằng act_map.this trong cuộc gọi hàm tạo AlertDialog của bạn.

+0

thanx! điều này đã giải quyết được vấn đề! – xenonite

+0

Và còn nếu nó không nằm trong lớp bên trong thì sao? –

14

Tôi cũng gặp sự cố với hướng dẫn Android MapView. Khi tôi nhấp vào biểu tượng, màn hình sẽ bị lỗi (một mContext rỗng sẽ được thông qua):

Sửa lỗi trên không hiệu quả đối với tôi. Thay vào đó, tôi đã thay đổi dòng mã sau đây từ lớp MapActivity từ:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable); 

này:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this); 

Bạn cũng cần phải sửa chữa nhà xây dựng bằng cách thêm boundCenterBottom mà là mất tích:

public HelloItemizedOverlay(Drawable defaultMarker, Context context) { 
    super(boundCenterBottom(defaultMarker)); 
    mContext = context; 
} 

(Có ảnh chụp màn hình đẹp nhưng không thể đăng vì tôi mới: P)

Hy vọng rằng sẽ giúp những người khác vẫn gặp sự cố với hướng dẫn và sửa lỗi ứng dụng của họ!

+0

Đã xảy ra sự cố tương tự và điều này đã khắc phục được sự cố. Làm thế nào nó có một lỗi rõ ràng như vậy tồn tại trong hướng dẫn của họ? – wbarksdale

+0

+1 Yup đây là bản sửa lỗi của tôi. –

2

Sử dụng this thay vào đó, đây là hướng dẫn tốt hơn nhiều so với hướng dẫn do google cung cấp.

+1

Ví dụ này hữu ích, nhưng không sử dụng mapView.getZoomControls(). Điều này có thể dễ dàng được thay thế bằng mapView.setBuiltInZoomControls (true) từ hướng dẫn ban đầu. – selwyn

2

cũng gọi populate() trong công cụ xây dựng Mapoverlay

Các vấn đề liên quan