SurfaceView getHolder返回null

时间:2015-12-04 09:16:28

标签: java android

我在这方面读了其他问题,但我觉得我的架构有点不同,所以我发帖。

我有一个MainActivity和多个视图的游戏。基本上,有一个LinearLayout填充MainActivity,并且根据状态在布局上设置不同的视图。例如,menuState(menuView),gameState(gameView),gameOverState(gameOverView)。

在我的BattleViewextends SurfaceView)中,我试图实现游戏循环。但是,由于BattleView返回null,我的Callback无法实现getHolder()

我将如何继续解决这个问题?

public class MainActivity extends AppCompatActivity {

GameScreen gs;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.init();
}

private void init(){
    this.gs = new GameScreen(this);
    this.hideSystemUI(this.gs);
    setContentView(this.gs);

}

然后我的GameScreen class包含BattleView class,在适当时调用。

public GameScreen(Context context){
    super(context);
    this.init();
}

private void init(){
    this.ms = new MapScreen(this.getContext(), this);
    ((MainActivity)this.getContext()).hideSystemUI(this.ms);
    this.addView(this.ms);
}

private void newMapScreen(){
    this.ms = new MapScreen(this.getContext(), this);
}

public void addBattleScreen(BattleScreen bs){
    //this.bs = new BattleScreen(this.getContext(), ms);
    this.removeView(this.ms);
    this.bs = bs;
    ((MainActivity)this.getContext()).hideSystemUI(this.bs);
    this.addView(this.bs);
}

嗯.. BattleScreen包含BattleView class并在那里初始化。然后,BattleView

 public BattleView(Context context, int monsterNumber, Hero hero){
    super(context);
    this.gameLoopInit();

    this.setBackgroundImage();

}//end

private void gameLoopInit(){
    holder = getHolder();  <------------- ERROR (null)
    System.out.println(holder);
    holder.addCallback(this);
}

0 个答案:

没有答案