2010-08-20 79 views
4

我一直在關注本教程:http://developer.android.com/resources/tutorials/views/hello-mapview.html 但在onTap mContext拋出一個NullPointerException ..任何人都知道爲什麼?這裏是我的代碼..上下文空指針

public class Mapitems extends ItemizedOverlay{ 
Context mContext; 

private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 

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

public Mapitems(Drawable defaultMarker, Context context) { 
     super(defaultMarker); 
     mContext = context; 
    } 
@Override 
protected OverlayItem createItem(int i) { 
    return mOverlays.get(i); 
} 

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

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

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

    } 

//編輯:我仍然有這個問題。賞金適用於任何能給我解釋爲什麼我會遇到這種錯誤的人,我將如何糾正?

//編輯2:它似乎過去的答案允許我點擊該項目,但沒有顯示其在地圖視圖中的圖標..任何人都知道爲什麼?

回答

3

看,你可能調用簡單構造

public Mapitems(Drawable defaultMarker) 

此構造不設置mContext,這就是爲什麼你會得到一個NullPointerException。
添加一條線如mContext = new Context()mContext = android.content.getApplicationContext()可能會解決該問題。

它也可能是一個空參數被供給到其他的構造

public Mapitems(Drawable defaultMarker, Context context) 

分配mContext時插入空檢查,並在必要提供一默認上下文隨後可以解決這個問題。

的構造是這樣的:

public Mapitems(Drawable defaultMarker) { 
    super(boundCenterBottom(defaultMarker)); 
    mContext = android.content.getApplicationContext(); 
    // or: mContext = new Context(); 
} 

public Mapitems(Drawable defaultMarker, Context context) { 
    super(defaultMarker); 
    if(context==null) 
     mContext = android.content.getApplicationContext(); 
     // or: mContext = new Context(); 
    mContext = context; 
} 

希望這能解決你的問題。

+0

謝謝你,先生。 – Skizit 2010-08-26 00:27:42

+0

不客氣。至於你的第二個問題,它可能是'HelloGoogleMaps'類中的東西,或者是你的版本中調用的任何東西。請確保您的項目的res/drawable /目錄中有一個圖像,並且您正確引用它。你可能會有這樣一行:this.getResources()。getDrawable(R.drawable。[imgFileName])'其中[imgFileName]是沒有擴展名的所需圖像的名稱(.png) – neXus 2010-08-26 12:06:35

0

當您使用帶有一個參數的構造函數時,沒有參考集,並且方法AlertDialog.Buidler(/*param*/)不需要空值。

在您的代碼中搜索您初始化類Mapitems的對象的位置。

請加入到「這個」教程

+0

我已經添加了一個鏈接。我應該如何/在哪裏初始化它? – Skizit 2010-08-20 15:13:02

3

得到了NPE,您的客戶端代碼將需要:

  • 使用2參數的構造函數而已,也就是說,一個了結在上下文中
  • 使用非空Context調用構造函數。如果從活動中傳遞this,請確保構造函數調用發生在onCreate()方法內或activity lifecycle以後。這意味着,例如,您不能直接將Mapitems對象初始化爲活動的字段。

我看了看你正在引用的教程,實際上他們忘了告訴你用上下文調用構造函數。在HelloItemizedOverlay.java,這樣的:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable); 

真的應該是:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this); 

更改代碼中的相關引用(你在哪裏實例化Mapitems),它應該工作。在你的代碼

+0

再看一遍,添加這個讓我可以點擊它,但不會在地圖視圖中顯示圖標。任何想法如何修復它我可以看到地圖中的圖標並點擊它們? – Skizit 2010-08-26 00:24:37

1

爲圖像不顯示,後更改呼叫設置上下文正確

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this); 

被叫構造函數不以同樣的方式作爲單個參數的構造函數處理圖像。更改2參數構造函數以包裝帶有boundCenterBottom的繪圖現在對我來說很有用

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