2015-01-26 1 views
0

У меня есть простая проблема, на которую много раз отвечал 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); 
    } 
} 

Я также попытался super.getGame().getContext() в классе TitleScreen, но обе попытки дает ту же ошибку в LogCat:

01-26 13: 28: 32.217: E/AndroidRuntime (1537): java.lang.RuntimeException: не удается запустить активность ComponentInfo {com.example.helloandroid/com.example.helloandroid.MainActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.content.res.Resources android .content.Context.getResources() ' на нулевом объекте ЭСТ ссылка

Почему это должно быть так трудно создать растровое изображение, когда я могу получить доступ к вытяжке, как это private Image wallVerImage = new Image(R.drawable.heli); без каких-либо ссылок на контекст? Как исправить мой код?

Благодаря

ответ

2

контекст в

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); 
    } 
+0

Очевидно. Решаемые. Благодарю. – tsorn

1

Рассмотрим создание 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; 
    } 
} 

Во-первых, объект создается со всеми полями, установленными в 0 или null. Затем инициализатор bitmap «s работает:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^