Android 自定义视图:在 onDraw 方法中获取每个 class 成员的空引用
Android Custom View: getting null references on every class members in the onDraw method
我正在尝试创建一个 android 自定义视图,但我遇到了一个相当奇怪的问题。
我在构造函数中设置的每个数据成员(String、Bitmap、...)在覆盖的 onDraw 方法中都变为 null。
代码如下:
public class SimulationView extends View
{
private static final String TAG = "SIMULATION_VIEW";
private String str;
private Bitmap mField;
public SimulationView(Context context) {
super(context);
str = new String("hello");
mField = BitmapFactory.decodeResource(getResources(), R.drawable.field);
Log.i(TAG_DEBUG, mField.getHeight() + " " + mField.getWidth()); // displays "1518 900" properly
Log.i(TAG, str); // displays "hello" properly
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.i(TAG, str); // throws java.lang.NullPointerException
Log.i(TAG, mField.getHeight() + " " + mField.getWidth()); // throws java.lang.NullPointerException (when previous line is commented of course)
invalidate();
}
public SimulationView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public SimulationView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context context) {
}
这是 String 导致 NPE 时的堆栈跟踪:
Process: com.example.simulation_view, PID: 5207
java.lang.NullPointerException: println needs a message
at android.util.Log.println_native(Native Method)
at android.util.Log.i(Log.java:160)
at com.example.simulation_view.SimulationView.onDraw(SimulationView.java:84)
at android.view.View.draw(View.java:15114)
这是 Bitmap 导致 NPE 时的堆栈跟踪:
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getHeight()' on a null object reference
at com.example.simulation_view.SimulationView.onDraw(SimulationView.java:83)
at android.view.View.draw(View.java:15114)
我做错了什么?
任何帮助将不胜感激!
祝你有美好的一天
您的初始化方法是空的。仅当您以编程方式实例化您的自定义视图时,您的代码才有效。如果在 xml 中声明,则不会初始化位图和字符串。使用 init
初始化,并且在仅以 Context
作为参数的构造函数中调用它
private void init(Context context) {
str = "hello";
mField = BitmapFactory.decodeResource(getResources(), R.drawable.field);
}
mField = BitmapFactory.decodeResource(getResources(), R.drawable.field);
此行返回一个空对象,因此当您尝试访问 getHeight()
方法时,它将抛出一个空指针异常。尝试验证参数是否符合您的预期。
对于 onDraw()
方法,您应该考虑全局变量的范围 String str
。很可能它在您的 onDraw()
方法中到达 Log.i(TAG, str);
时还没有被赋值。考虑改用局部变量并将其作为参数传递给必要的方法。
我正在尝试创建一个 android 自定义视图,但我遇到了一个相当奇怪的问题。
我在构造函数中设置的每个数据成员(String、Bitmap、...)在覆盖的 onDraw 方法中都变为 null。
代码如下:
public class SimulationView extends View
{
private static final String TAG = "SIMULATION_VIEW";
private String str;
private Bitmap mField;
public SimulationView(Context context) {
super(context);
str = new String("hello");
mField = BitmapFactory.decodeResource(getResources(), R.drawable.field);
Log.i(TAG_DEBUG, mField.getHeight() + " " + mField.getWidth()); // displays "1518 900" properly
Log.i(TAG, str); // displays "hello" properly
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.i(TAG, str); // throws java.lang.NullPointerException
Log.i(TAG, mField.getHeight() + " " + mField.getWidth()); // throws java.lang.NullPointerException (when previous line is commented of course)
invalidate();
}
public SimulationView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public SimulationView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context context) {
}
这是 String 导致 NPE 时的堆栈跟踪:
Process: com.example.simulation_view, PID: 5207
java.lang.NullPointerException: println needs a message
at android.util.Log.println_native(Native Method)
at android.util.Log.i(Log.java:160)
at com.example.simulation_view.SimulationView.onDraw(SimulationView.java:84)
at android.view.View.draw(View.java:15114)
这是 Bitmap 导致 NPE 时的堆栈跟踪:
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getHeight()' on a null object reference
at com.example.simulation_view.SimulationView.onDraw(SimulationView.java:83)
at android.view.View.draw(View.java:15114)
我做错了什么? 任何帮助将不胜感激!
祝你有美好的一天
您的初始化方法是空的。仅当您以编程方式实例化您的自定义视图时,您的代码才有效。如果在 xml 中声明,则不会初始化位图和字符串。使用 init
初始化,并且在仅以 Context
作为参数的构造函数中调用它
private void init(Context context) {
str = "hello";
mField = BitmapFactory.decodeResource(getResources(), R.drawable.field);
}
mField = BitmapFactory.decodeResource(getResources(), R.drawable.field);
此行返回一个空对象,因此当您尝试访问 getHeight()
方法时,它将抛出一个空指针异常。尝试验证参数是否符合您的预期。
对于 onDraw()
方法,您应该考虑全局变量的范围 String str
。很可能它在您的 onDraw()
方法中到达 Log.i(TAG, str);
时还没有被赋值。考虑改用局部变量并将其作为参数传递给必要的方法。