我有一个自定义视图,我在'main'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);
我知道这是一个我忽略的错误!感谢大家的答案,我很感激。我希望这证明对遇到类似问题的人有用。
答案 0 :(得分:1)
如果你想创建一个新的,试试这个,
在您的xml中将linearlayout作为持有者
<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中就没问题了。
答案 1 :(得分:-2)
您没有从方法调用中“接收”异常。方法可能抛出一个异常,您可能会在try-catch块中捕获该异常。在这种情况下,catch块会捕获异常。否则,它将发生在方法内部。由于调用者抛出异常,因此错误不在您的方法中。
在这种情况下:
boolean value = true;
drawView.setUserData(value);
唯一可以为null的是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);
如果重写默认窗口小部件样式,则使用此构造函数。