私はJavaで書かれた簡単なAndroidゲームを作っています。ここでsetContentView()スレッド内
public void startTheGame(View v) {
theGame = new Panel(this);
setContentView(theGame);
}
は、パネルのコードは(ある:私は「startTheGame」と呼ばれるメソッドを呼び出すボタンを持っている「メイン」レイアウトインサイド
私は私の活動を持っている...
public class GameName extends Activity{
...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
簡略化)
class Panel extends SurfaceView implements SurfaceHolder.Callback {
public GameThread _thread;
public Panel(Context context) {
super(context);
getHolder().addCallback(this);
setFocusable(true);
}
...
@Override
public void surfaceCreated(SurfaceHolder holder) {
_thread = new GameThread(getHolder(), this);
_thread.setRunning(true);
_thread.start();
}
...
}
私が見ることができるように、私は "GameThread"クラスを開始しています...ここではそれは以下です:
class GameThread extends Thread {
private SurfaceHolder _surfaceHolder;
private Panel _panel;
private boolean _run = false;
public GameThread(SurfaceHolder surfaceHolder, Panel panel) {
_surfaceHolder = surfaceHolder;
_panel = panel;
}
public void setRunning(boolean run) {
_run = run;
}
@Override
public void run() {
Canvas c;
while (_run) {
c = null;
try {
...
if (health <= 0) {
_run = false;
//change views?
setContentView(R.layout.over);
}
c = _surfaceHolder.lockCanvas(null);
synchronized (_surfaceHolder) {
_panel.onDraw(c);
}
...
} finally {
// do this in a finally so that if an exception is
// thrown
// during the above, we don't leave the Surface in an
// inconsistent state
if (c != null) {
_surfaceHolder.unlockCanvasAndPost(c);
}
try {
Thread.sleep(60);
} catch (Exception e) {
}
}
}
}
うまくいけば、健康が= 0 <であれば、それはスレッドを停止し、私は「オーバー」と呼ばれる、私が作成した別のレイアウトに変更しようとしていることがわかります。
画面の更新(描画)が停止するだけですが、新しいパネルは表示されません。
私が試してみた:
GameName cs = ((GameName)getApplicationContext())
cs.setContentView(R.layout.over);
しかし、私はClassCastExceptionが取得しています...
を助けてください!
私は別のアクティビティに変更することができますか?他の活動からですか? – sirmdawg
はい、各アクティビティは一意のコンテンツビューに関連付けられます。または、2人は、肖像画と風景を区別したいと思うでしょうか?変化は技術的なものであれば問題ありません。避けるべきことは、いくつかの役割を持つアクティビティを持つことです。 – Shlublu
ターゲットがAPIレベル5以上であれば、新しいアクティビティを開始する前に 'overridePendingTransition(0、0)'を呼び出してアクティビティアニメーションを取り除くことができます。 –