2010-06-08 75 views
1

我不能爲我的生活找出爲什麼我得到一個NullPointerException。Android自定義對話框空指針異常

當用戶點擊特定圖像上,一個對話框窗口應該彈出並顯示所述圖像的放大版本:

private OnClickListener coverListener = new OnClickListener() 
{ 
public void onClick(View v) 
{ 
    showDialog(DIALOG_COVER); 
} 
}; 

DIALOG_COVER被設定爲= 0。

的相關onCreateDialog看起來是這樣的:

protected Dialog onCreateDialog(int id) { 
Dialog dialog; 
switch(id) 
{ 
    case DIALOG_COVER: 
    dialog = new Dialog(mContext); 
    dialog.setContentView(R.layout.cover_dialog); 
    dialog.setTitle(book.getTitle()); 
    ImageView coverLarge = (ImageView)findViewById(R.id.coverLarge); 
    coverLarge.setImageBitmap(book.getCover()); 
     break; 
    default: 
     dialog = null; 
} 
return dialog; 
} 

以供參考,這是cover_dialog.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/coverDialog" 
      android:orientation="horizontal" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:padding="10dp"> 
<ImageView android:id="@+id/coverLarge" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:scaleType="fitStart" 
      /></LinearLayout> 

現在,先前所描述的圖像被點擊時,該應用程序立即崩潰和通過的logcat引發以下錯誤:

06-08 13:29:17.727: ERROR/AndroidRuntime(2220): Uncaught handler: thread main exiting  due to uncaught exception 
06-08 13:29:17.757: ERROR/AndroidRuntime(2220): java.lang.NullPointerException 
06-08 13:29:17.757: ERROR/AndroidRuntime(2220):  at org.kylehughes.android.brarian.AndroidBrarian.onCreateDialog(AndroidBrarian.java:259) 

在考慮中的線是指這條線內onCreateDialog的:

coverLarge.setImageBitmap(book.getCover()); 

基本上,我不明白爲什麼coverLarge在這一點上是空的。任何幫助將非常感激。

回答

2

關於什麼的:

/** snip **/ 
LayoutInflater factory = LayoutInflater.from(mContext); 
View dialogView = factory.inflate(R.layout.cover_dialog,null); 
ImageView coverLarge = (ImageView)dialogView.findViewById(R.id.coverLarge); 
dialog = new Dialog(mContext); 
dialog.setContentView(dialogView); 
dialog.setTitle(book.getTitle()); 
coverLarge.setImageBitmap(book.getCover()); 
/** snip **/ 

就從頭寫起。請檢查語法

+0

基本上,我正在尋找對話框視圖中的R.id.coverLarge引用,同時您正在將它查找到活動視圖 – 2010-06-08 19:22:54

+0

您剛剛爲我節省了更多的小時數。非常感謝你。 – 2010-06-08 19:25:48

0

(ImageView)findViewById(R.id.coverLarge); 

返回null值。您可能會將無效/格式不正確的ID字符串傳遞給findViewById方法。你有沒有檢查(調試)這個字符串看起來像什麼之前,你得到NPE?

+0

這只是一個非常長的數字,與我應用程序中的其餘ID一致。 – 2010-06-08 18:10:10

0

是否有可能爲不同的xml文件定義了不同種類的視圖(例如按鈕)的相同ID(coverLarge)?另外,請注意您用於設置對話框的標識號是cover_dialog,但在您的XML文件中有coverDialog

+0

coverDialog表示cover_dialog.xml中的LinearLayout。我嘗試將ImageView重命名爲完全荒謬的東西(以及它引用的所有位置),並且仍然出現相同的錯誤。 – 2010-06-08 18:09:33

0

您在該行有一些事情正在進行,即某些調試輸出會有所幫助。我會從System.out.println開始,緊接在違規行之前的coverLargebook的值。我知道他們不應該是空的,但是把這些可能性排除在外並不會傷害他們。

+0

哦,是的,在完成之後,捕獲book.getCover()的值並將其打印出來。再次,只是爲了確保。 – Josh 2010-06-08 19:04:48

+0

coverLarge爲null,book和book.getCover都將地址返回給它們各自的對象。 – 2010-06-08 19:17:47