我试图创建一个android自定义视图,但我面临一个相当奇怪的问题。
在构造函数中设置的每个数据成员(字符串、位图,…)在重写的OnDraw方法中都变为空。
代码如下:

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) {
}

下面是当字符串导致npe时的stacktrace:
   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)

下面是当位图导致npe时的stacktrace:
  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)

我做错什么了?
任何帮助都将不胜感激!
祝您今天过得愉快

最佳答案

init方法为空。只有以编程方式实例化自定义视图时,代码才能工作。如果使用XML声明,则位图和字符串不会初始化。使用init初始化,并在只接受Context作为参数的构造函数中调用它

private void init(Context context) {
    str = "hello";
    mField = BitmapFactory.decodeResource(getResources(), R.drawable.field);
}

08-18 06:18
查看更多