0

Mario Zechner による 2011 年の Apress 本「Beginning Android Games」で説明されているように、2D ゲーム フレームワークに基づいて単純なゲームを作成しようとしています。役立つかもしれませんし、そうでないかもしれませんが、どちらにしても:

ゲーム全体で 1 つのアクティビティしかありません。すべてがビットマップにレンダリングされ、SurfaceView に送信されます。SurfaceView に送信される内容は、ゲームの画面によって異なります。

ユーザーがメイン メニュー画面の EditView に自分の名前を入力できるシンプルなハイスコア システムを実装したいと考えています。SurfaceView と EditView を RelativeLayout と組み合わせることができましたが、ユーザーがメイン メニュー画面を通過すると、EditView が取り除かれます。

このクラスには他にもたくさんありますが、ここに私が重要だと思うもののスニペットがあります:

    public abstract class AndroidGame extends Activity implements Game{
      public EditText et;
      public RelativeLayout rl;

      public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        et = new EditText(this);
        renderView = new AndroidFastRenderView(this, frameBuffer);

        rl = new RelativeLayout(this);
        rl.addView(renderView);
        rl.addView(et);
        setContentView(rl);
      }
    } 

上記はゲームの唯一のアクティビティです。AndroidFastRenderView クラスは SurfaceView を拡張します。私が抱えている問題は、SurfaceView がゲーム全体で持続する必要がある一方で、EditText が短時間だけ持続し、その後タッチ イベントに基づいて消える必要があることです。

クラス MainMenuScreen から RelativeLayout.removeView(et) を呼び出そうとします。このクラスは、SurfaceView に送信されるビットマップの作成と、タッチ イベントのリッスンを担当します。しかし、あるスレッドで定義されたビューを別のスレッドから編集できないというキャッチされない例外が発生します。

小説で申し訳ありませんが、私はこれを何時間も自分で解決しようとしてきましたが、うまくいきませんでした. これは私が得ていない非常に単純なことのように感じます。どんな助けでも大歓迎です!

4

1 に答える 1

0

うーん...ビューを追加および削除できるのはUIスレッドだけだと思います。次のようにスレッドを呼び出してみてください。

runOnUiThread(new Runnable(){
    public void run() {
        /* STUFF To do in Thread */
        //Delete the view...
        rl.removeView(et);
}});

それが役に立てば幸い :)

于 2012-07-20T21:45:20.607 に答える