Ссылка на pojo в Android теряется во время события onClick - PullRequest
0 голосов
/ 19 сентября 2011

Я разрабатываю небольшую игру, в которой у меня есть изменяющиеся изображения и панель управления (несколько кнопок), которую пользователь должен нажимать на них в соответствии с изображением. Класс GameView расширяет SurfaceView, поэтому, когда начинается действие, он просто создает игру и устанавливает вид контента (макет с SurfaceView и некоторые кнопки в относительном макете). Игровой вызов loadGameObjects во время обратного вызова setSurfaceSize выглядит следующим образом:

public void setSurfaceSize(int width, int height)  
{  
 synchronized (holder)  
 {  
  canvasWidth = width;  
  canvasHeight = height;  
  GameView.this.postInvalidate();  
  loadGameObjects(getResources());  
 }  

}
В методе loadGameObjects я сохраняю ссылку на игровой объект pojo, который не является представлением (но содержит ссылки на изображения) следующим образом:

public void loadGameObjects(Resources resouces)  
{ 
 List<GameObject> gameObjects = new LinkedList<GameObject>();
 int middleX = getWidth()/2;
 int middleY = getHeight()/2;
 //Create the backgroung game object
 BitmapDrawable background = (BitmapDrawable)resouces.getDrawable(R.drawable.g_monitor);
 Bitmap bitmap = Bitmap.createScaledBitmap(background.getBitmap(), getWidth(), 
            getHeight(), true);
 background = new BitmapDrawable(bitmap);
 gameObjects.add(new GameObject(this, getContext(), background, new Point(0,0)));
 //Create the game object with all its images.
 Map<RunningGoblinResourceEnum, BitmapDrawable> goblinImgs = new HashMap<RunningGoblinResourceEnum, BitmapDrawable>();
 goblinImgs.put(RunningGoblinResourceEnum.greenGoblinUp, (BitmapDrawable)resouces.getDrawable(R.drawable.goblin_up_green));
 //This map get more entries like this...

 //ourGoblin is a member var that later will be null in onClick
 ourGoblin = new RunningGoblinObject(this, getContext(), goblinImgs, 
            new Point(middleX, middleY));
 gameObjects.add(ourGoblin);
 setGameObjects(gameObjects); 
}  

Во время doDraw вызывается метод «рисования» игровых объектов, чтобы нарисовать себя на холсте.
Моя проблема в том, что когда я нажимаю кнопку, ссылка на ourGoblin игровой объект становится нулевой, хотя она действительна во время метода loadGameObjects. Может кто-нибудь сказать мне, что мне не хватает?

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

У меня было что-то похожее. В методе loadGameObjects вы создаете экземпляр ourGoblin с помощью оператора new. Однако, если это представление в макете, которое использовалось с setContentView, система не связывает ваше представление с представлением в макете, и, таким образом, с системной точки зрения представление в макете все еще равно нулю, пока findViewById не будет вызван с это представление id. Попытайтесь вызвать findViewById для этого идентификатора и посмотреть, является ли ourGoblin все еще нулевым, если нет, то имейте в виду, что у вас все еще есть два экземпляра этого объекта, один создан с использованием оператора new, а другой - системой.

0 голосов
/ 20 сентября 2011

Конечно,
Вы можете видеть, что это очень простая и понятная реализация onClick:

public void onClick(View v)
{
 Log.d(getClass().getName() + "onClick", "ourGoblin = " + ourGoblin);
 if(ourGoblin == null)
  return;
 Log.d(getClass().getName() + "onClick", "ourGoblin = " + ourGoblin.getCurrentImageEnum().toString());
 int id = v.getId();
 switch(id)
 {
 case R.id.greenUp:
  if(RunningGoblinResourceEnum.greenGoblinUp.equals(ourGoblin.getCurrentImageEnum()))
  {
   //Do something to statistics
  }
  break;
 }
}  

, а также мой XML-файл макета выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gameFrame"
android:layout_width="match_parent" android:layout_height="match_parent">
  <com.test.game.GameView android:id="@+id/gameView"
    android:layout_width="match_parent" android:layout_height="match_parent" />
  <RelativeLayout android:id="@+id/controlPanel" 
    android:layout_width="match_parent" android:layout_height="match_parent">
  <Button android:id="@+id/greenUp" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:layout_centerInParent="true"
        android:text="up"/>
  </RelativeLayout>
 </FrameLayout>
...