1

私は GameView という名前のビューを拡張するクラスを持っています。MainActivity では、それを contentView として配置します。

    if(Const.gameView == null){
        Const.gameView = new GameView(this);
        Const.gameView.setViews(Const.chickenArr,Const.chickenViewArr,message,score_message , this.importantMessage  , this.showTimerMessage);
        setContentView(Const.gameView);

    }

ここで問題に直面します。アクティビティを終了して戻ってきたら、GameView をもう一度表示したいと思います。

上記のコードを使用すると、再度 MainActivity に戻ったときに、自分の gameView が表示されませんでした。setContentView(Const.gameView); を設定してコードを変更すると、「if」の外側でエラーが発生します

11-10 22:17:35.821: E/AndroidRuntime(1580): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

私は何をすべきか?

ゲームビュー:

public GameView(Context context) {
    super(context);     
    int picture = Const.a1;
    if(backgroundBitmap == null)
        backgroundBitmap = BitmapFactory.decodeResource(getResources(), picture);
    // TODO Auto-generated constructor stub
}

public void setViews(Chicken[] chickenArr, ChickenView[] chickenViewArr,Messages message , Messages messageScore,
        Messages gameoverMes , Messages showRemailTimeMes) {
    this.chickenArr = chickenArr;
    this.chickenViewArr = chickenViewArr;

    this.message=message;
    this.  messageScore =   messageScore;
    this.gameoverMes =gameoverMes;
    this.showRemailTimeMes=showRemailTimeMes;
}

   @Override
public void onDraw(Canvas canvas)
{
    canvas.drawBitmap(this.backgroundBitmap, 1, 1, null);

    //meassage
    this.message.onDraw(canvas);
        ......

}

4

3 に答える 3

3

これを試して...

if(Const.gameView == null){
    Const.gameView = new GameView(this);
    Const.gameView.setViews(Const.chickenArr,Const.chickenViewArr,message,score_message , this.importantMessage  , this.showTimerMessage);
    setContentView(Const.gameView);
} else {
    ViewParent parent = Const.gameView.getParent();
    if(parent != null && parent instanceof ViewGroup) {
       ViewGroup viewGroup = (ViewGroup)parent;
       viewGroup.removeView(Const.gameView);
    }
  setContentView(Const.gameView);
}

Const クラスのビューへの静的参照を維持していることに気付きました。コンテキストはすべてのビューに関連付けられているため、ビューの静的参照を維持しないことをお勧めします。したがって、コンテキストの漏洩につながります...

于 2013-11-11T10:13:51.903 に答える
0

複数のアクティビティで同じビューを使用することはできません。代わりに、ビューの新しいインスタンスを作成する必要があります

 like every time you have to create new instance
Const.gameView = new GameView(this);
于 2013-11-11T10:03:18.063 に答える