1

みんな。Android 用の基本的なタイクーン ゲームを作成しようとしています。タイマーを使用して 5 秒ごとにテキスト ビューの値をインクリメントしようとしていますが、テキスト ビューは更新されません。これまでの私のコードは次のとおりです。

public class Town extends Activity implements OnClickListener {
Timer timer;
TimerTask task;
TextView goldTV;
TextView woodTV;
TextView foodTV;
TextView stoneTV;
TextView cashTV;
int gold = 20;
int wood = 20;
int food = 20;
int stone = 20;
int cash = 200;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_town);
    goldTV = (TextView) findViewById(R.id.textView1);
    woodTV = (TextView) findViewById(R.id.TextView01);
    foodTV = (TextView) findViewById(R.id.TextView02);
    stoneTV = (TextView) findViewById(R.id.TextView03);
    cashTV = (TextView) findViewById(R.id.TextView04);
    timer = new Timer();
    task = new TimerTask() {

        @Override
        public void run() {
            gold++;
            goldTV.setText(gold);
            try {
                this.wait(2000);
            }
            catch (InterruptedException e){
            }
        }

    };
}
@Override
public void onClick(View arg0) {
    // TODO Auto-generated method stub

}

}

4

3 に答える 3

4

あなたのrun()方法では

@Override
public void run() {
          gold++;
          goldTV.setText(gold);

          try {
                this.wait(2000);
          }
          catch (InterruptedException e){

          }
}

あなたはsetText(int resId)代わりに電話していますsetText(CharSequence c);

実際の整数を表示するには、 からにgold変換します。intString

String goldStr = String.valueOf(gold);

goldTV.setText(goldStr);
于 2012-11-27T23:30:47.700 に答える
3

あなたの問題は、UI スレッド以外のテキストを変更していることです。UIスレッドで実行することをお勧めします。さらに、数値を文字列に変換する必要があります。そうしないと、Android はリソース ID を探していると判断します。両方を合わせて、そして...

task = new TimerTask() {

    @Override
    public void run() {
        gold++;
        runOnUiThread(new Runnable(){
           public void run(){
            goldTV.setText(""+gold);
           }
        });
        try {
            this.wait(5000);
        }
        catch (InterruptedException e){
        }
    }

};

または、次のようにハンドラーを使用することもできます。

Handler handler = new Handler();
Runnable task=new Runnable(){
   public void run(){
      handler.postDelayed(this,5000);
      goldTV.setText(""+gold);
   }
});
handler.postDelayed(task,5000);
于 2012-11-27T23:28:04.190 に答える
1

TimerTask は Timer オブジェクトと共に使用する必要があります。コードでは、タスクを実行することはありません。

編集: 代わりにこれを試してください:

goldTV.postDelayed(new Runnable() {

            @Override
            public void run() {
                gold++;
                goldTV.setText(gold+"");
                goldTV.postDelayed(this,2000);
            }
        }, 2000);
于 2012-11-27T23:29:07.030 に答える