是否真的有必要通过超类传播上下文以从可绘制对象创建简单的位图?

Is it really necessary to propagate context through superclasses to create a simple bitmap from drawables?

我有一个简单的问题,之前已经在 SO 上回答了很多次,但我不明白答案,我的代码也无法运行。

我想从可绘制对象创建位图。

public class Helicopter extends Sprite {
    private Context context;
    private Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.heli1_east_rot);
    public Helicopter(Context c) {
        context = c;
    }
}

public class TitleScreen extends State {
    private Helicopter heli;
    public TitleScreen(Context c) {
        heli = new Helicopter(c);
   }
}

public class MainActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     Game game = new Game(this, null);
     game.pushState(new TitleScreen(game.getContext()));
     setContentView(game);
    }
}

我也曾在 TitleScreen class 中尝试过 super.getGame().getContext(),但两次尝试都在 LogCat 中给出了相同的错误:

01-26 13:28:32.217: E/AndroidRuntime(1537): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.helloandroid/com.example.helloandroid.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference

当我可以像这样 private Image wallVerImage = new Image(R.drawable.heli); 访问可绘制对象而无需任何上下文参考时,为什么创建位图必须如此困难? 如何修复我的代码?

谢谢

中的上下文
private Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.heli1_east_rot);

未指定,无法引用资源。将初始化放在这里:

 public Helicopter(Context c) {
        context = c;
bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.heli1_east_rot);
    }

让我们考虑创建一个 Helicopter:

public class Helicopter extends Sprite {
    private Context context;
    private Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.heli1_east_rot);
    public Helicopter(Context c) {
        context = c;
    }
}

首先,创建一个所有字段都设置为 0null 的对象。然后,bitmap 的初始化器工作:

 bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.heli1_east_rot);

但是存储到 context 的值仍然是 null。你得到一个 NPE。

如果您没有 NPE,之后将执行构造函数中的代码,将 context 设置为 c

这听起来可能违反直觉,但当您的代码在初始化程序和静态初始化程序中执行时,您可以在初始化字段中看到 null 值。

示例:

class X {
    int a = getB();
    int b = 5;
    int getB() { return b; }
}

public class A {
    public static void main(String[] p) {
    X x = new X();
    System.out.println("x.a="+x.a+"  x.b="+x.b);
    }
}

运行并打印:

$ java A
x.a=0  x.b=5