【问题标题】:Android Custom Dialog NullPointerExceptionAndroid 自定义对话框 NullPointerException
【发布时间】:2010-06-08 17:49:03
【问题描述】:

我终其一生都无法弄清楚为什么会收到 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 为空。任何帮助将不胜感激。

【问题讨论】:

    标签: java android dialog nullpointerexception


    【解决方案1】:

    关于:

    /** 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 **/
    

    刚从头开始写。请检查语法

    【讨论】:

    • 基本上我正在寻找对话框视图中的 R.id.coverLarge 引用,而您正在寻找它到活动视图中
    • 您先生为我节省了更多时间的挫败感。非常感谢。
    【解决方案2】:

    这个

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

    返回一个null值。您可能将无效/格式错误的 id 字符串传递给 findViewById 方法。在获得 NPE 之前,您是否检查过(调试过)这个 String 的样子?

    【讨论】:

    • 这只是一个很长的数字,与我应用中的其余 ID 一致。
    【解决方案3】:

    您是否有可能有一个不同的 xml 文件为不同类型的视图(例如按钮)定义相同的 ID (coverLarge)?另外,请注意您用于设置对话框的 id 是 cover_dialog,但在 XML 文件中您有 coverDialog

    【讨论】:

    • coverDialog代表cover_dialog.xml里面的LinearLayout。我尝试将 ImageView 重命名为完全荒谬的东西(以及它被引用的所有地方),但我仍然得到同样的错误。
    【解决方案4】:

    您在该行发生了一些事情,一些调试输出会有所帮助。我会从System.out.println'ing 开始,紧接在违规行之前的coverLargebook 的值。我知道它们不应该为空,但排除这些可能性并没有什么坏处。

    【讨论】:

    • 哦,是的,完成之后,获取 book.getCover() 的值并将其打印出来。再次,只是为了确保。
    • coverLarge 为空,并且 book 和 book.getCover 都将地址返回到各自的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 2019-01-02
    相关资源
    最近更新 更多