1

我有一个在“主”XML 文件中声明的自定义视图:

    <com.app.DrawView
    android:id="@+id/my_view"
    android:layout_height="match_parent"
    android:layout_width="match_parent" />

然后在我活动的 onCreate 方法中:

setContentView(R.layout.main);

这一切都适用于显示自定义视图。但我需要做的是将值传递给自定义视图。因此,我尝试制作自定义视图类的实例:

DrawView drawView = (DrawView) findViewById(R.id.my_view);

然后,在 DrawView 类中,我创建了一个方法:

public void setUserData(boolean data){
      useEraser = data;
}

现在,我的问题是在我的活动中尝试访问 DrawView 对象的此方法时,我不断收到 NullPointerExeption,如下所示:

boolean value = true;
drawView.setUserData(value);

错误指向“drawView.setUserData(value)”行。我究竟做错了什么?我知道我一定犯了一个简单的错误,但它让我疯狂地试图找到它。任何帮助或建议都会很棒!

编辑:我接受了一个正确的答案,但是,我仍然想知道为什么我的原始解决方案不起作用。因此,我发现,尽管我在问题中正确订购了它,但我还是放置了

DrawView drawView = (DrawView)findViewById(R.id.my_view);

setContentView(R.layout.main);

我知道这是我忽略的一个简单错误!感谢大家的回答,我很感激。我希望这对任何面临类似问题的人都有用。

4

2 回答 2

1

如果你想创建一个新的试试这个,

在您的 xml 中放置一个线性布局作为支架

<LinearLayout
        android:id="@+id/ln1"
        android:layout_width="wrap_content"
       android:layout_height="300dp" >

    </LinearLayout>

并在下面的 oncreate 中使用

LinearLayout ln = (LinearLayout)findViewById(R.id.ln1);
         com.example.mixed.DrawView dw2 = new DrawView(getApplicationContext());
         dw2.setUserData(false);
         ln.addView(dw2);

如果你把它放在你的布局xml中,它就没有问题。

在此处输入图像描述

于 2012-11-28T21:53:21.510 回答
-2

您不会从方法调用中“接收”异常。方法可能会抛出异常,您可能会在 try-catch 块中捕获该异常。在这种情况下,异常将被 catch 块捕获。否则,它会发生在方法内部。由于调用者正在抛出异常,因此错误不在您的方法中。

在这种情况下:

boolean value = true;
drawView.setUserData(value);

唯一可以为空的是drawView。因此,findViewById 返回 null,或者您在其他地方将 drawView 设置为 null。您可以通过在此处设置断点来证明这一点:

DrawView drawView = (DrawView) findViewById(R.id.my_view);

并检查 drawView 的值。

根据您提供的信息,我不明白为什么会这样,但这是您必须做的检查。

顺便说一句,您应该始终在自定义视图中提供所有 3 个视图构造函数原型。你错过了:

 public DrawView(Context context, AttributeSet attrs, int defaultStyle){
 super(context, attrs, defaultStyle);

如果默认小部件样式被覆盖,则使用此构造函数。

于 2012-11-28T22:18:01.407 回答