2010-06-08 2 views
1

Я не могу на всю жизнь выяснить, почему я получаю исключение NullPointerException.Android Custom Dialog NullPointerException

Когда пользователь нажимает на конкретное изображение, диалоговое окно должно всплывающее и отобразить большую версию указанного изображения:

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 имеет значение null в этой точке. Любая помощь приветствуется.

ответ

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 в диалоговом окне, пока вы ищете ее в виде Activity. –

+0

Вы, сэр, только что спасли мне еще много часов разочарования. Большое спасибо. –

0

Этот

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

возвращает значение null. Вы можете передать недопустимый/неверный идентификатор String методу findViewById. Вы проверили (отлаживали), как выглядит эта строка, прежде чем вы получите NPE?

+0

Это очень длинное число в соответствии с остальными идентификаторами в моем приложении. –

0

Возможно ли, что у вас есть другой файл xml, определяющий один и тот же идентификатор (coverLarge) для другого вида вида (например, кнопки)? Также обратите внимание на то, как идентификатор, который вы используете для настройки диалога, - cover_dialog, но в файле XML у вас есть coverDialog

+0

CoverDialog представляет LinearLayout внутри cover_dialog.xml. И я попытался переименовать ImageView в нечто совершенно смешное (и все места, на которые он ссылается), и я все равно получаю ту же ошибку. –

0

У вас есть несколько вещей, которые происходят в этой строке, что поможет некоторый вывод отладки. Я начинал с System.out.println 'значениями coverLarge и book непосредственно перед линией нарушения. Я знаю, что они не должны быть пустыми, но это не помешало бы управлять этими возможностями.

+0

О да, и после того, как вы это сделали, запишите значение book.getCover() и распечатайте его. Опять же, просто чтобы убедиться. – Josh

+0

coverLarge is null, и как book, так и book.getCover возвращают адреса в соответствующие объекты. –