在onClick事件期间,对Android中的pojo的引用将丢失

时间:2011-09-19 16:05:36

标签: android image onclick pojo

我正在开发一款小型游戏,其中我有更改的图像和一个控制面板(一些按钮),用户可以根据显示的图像按下它们。 GameView类扩展了SurfaceView,因此当活动开始时它只是创建游戏并设置内容视图(使用SurfaceView和相对布局中的一些按钮的布局)。游戏在setSurfaceSize回调期间调用loadGameObjects如下:

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期间,调用游戏对象“draw”方法在画布上绘制自己 我的问题是,当我点击按钮时,对 ourGoblin 游戏对象的引用为null,尽管它在loadGameObjects方法中有效。 有人可以告诉我我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

我有一些类似的东西。 在loadGameObjects方法中,使用new运算符创建ourGoblin实例。但是,如果这是与setContentView一起使用的布局中的视图,则系统不会将您的视图与布局中的视图相关联,因此从系统的角度来看,布局中的视图仍然为null,直到将调用findViewById这个观点id。尝试在该id上调用findViewById并查看myGoblin是否仍为null,如果没有,请记住,您仍然有两个该对象的实例,一个使用new运算符创建,另一个使用系统创建。

答案 1 :(得分:0)

当然,
您可以看到它是一个非常简单直接的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>