質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

621閲覧

AndroidStudio 画面遷移の途中でボタンのクリック処理ができなくなります。

hacchan

総合スコア14

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/06/15 06:38

前提・実現したいこと・問題

いつもお世話になっております。
現在AndroidStudioで簡単なゲームを作っています。

①スタート画面↓
②スタートボタンを押す↓
③プレイ画面↓
④30秒経つ↓
⑤リトライ画面↓
⑥リトライボタンを押す↓
⑦スタート画面に戻る

という流れをまず作りたく、下記のようにコードを書きました。

そうすると、⑤までは問題ないのですが、
表示されているリトライボタンを押しても反応がなく、スタート画面に戻れません。

なぜでしょうか。

ちなみに、上の流れで、
①→②→⑤→⑥→⑦と、プレイ画面を表示させない流れで書くと、
リトライボタンも押せて、スタート画面とリトライ画面を行き来することができます。

よろしくお願いいたします。

エラーメッセージ

エラーログには以下のように出ています。

06-15 15:04:30.757 6703-6703/? E/Zygote: isWhitelistProcess - Process is Whitelisted 06-15 15:04:30.758 6703-6703/? E/libpersona: scanKnoxPersonas Couldn't open the File - /data/system/users/0/personalist.xml - No such file or directory

該当のソースコード

Java

1package com.hachiya.candyzombie; 2 3import android.app.Activity; 4import android.content.pm.ActivityInfo; 5import android.os.Bundle; 6import android.os.Handler; 7import android.view.View; 8import android.widget.ImageButton; 9 10import java.util.Timer; 11import java.util.TimerTask; 12 13public class MainActivity extends Activity { 14 15 private View view; 16 17 //カウントダウンのための変数 18 private Handler handlerA = new Handler(); 19 private final static long MSEC_A = 30; 20 private static final long TIME = 30; 21 private long remainedTime_A; 22 private long gameStarted; 23 24 @Override 25 protected void onCreate(Bundle savedInstanceState) { 26 super.onCreate(savedInstanceState); 27 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 28 29 setScreenStart(); 30 } 31 32 //スタート画面 33 public void setScreenStart() { 34 setContentView(R.layout.activity_screenstart); 35 36 ImageButton startButton = findViewById(R.id.start_button); 37 38 startButton.setOnClickListener(new View.OnClickListener() { 39 @Override 40 public void onClick(View v) { 41 42 gameStarted = System.currentTimeMillis(); 43 44 setScreenPlay(); 45 } 46 }); 47 } 48 49 //リトライ画面 50 public void setScreenRetry() { 51 setContentView(R.layout.activity_screenretry); 52 53 ImageButton retryButton = findViewById(R.id.retry_button); 54 55 retryButton.setOnClickListener(new View.OnClickListener() { 56 @Override 57 public void onClick(View v) { 58 setScreenStart(); 59 } 60 }); 61 } 62 63 //プレイ画面 64 public void setScreenPlay() { 65 66 view = new screenPlay(this); 67 setContentView(view); 68 69 //30秒経ったらリトライ画面へ移る 70 Timer timerA = new Timer(false); 71 timerA.schedule(new TimerTask() { 72 public void run() { 73 handlerA.post(new Runnable() { 74 public void run() { 75 remainedTime_A = TIME - (System.currentTimeMillis() - gameStarted) / 1000; 76 if(remainedTime_A < 0){ 77 setScreenRetry(); 78 return; 79 } 80 } 81 }); 82 } 83 }, 0, MSEC_A); 84 } 85}

Java

1package com.hachiya.candyzombie; 2 3import android.content.Context; 4import android.content.res.Resources; 5import android.graphics.Bitmap; 6import android.graphics.BitmapFactory; 7import android.graphics.Canvas; 8import android.graphics.Color; 9import android.graphics.Paint; 10import android.view.View; 11 12public class screenPlay extends View { 13 14 private Bitmap playBgImg1; 15 private Bitmap playBgImg1_1; 16 17 Paint timePaint = new Paint(); 18 19 public screenPlay(Context context){ 20 super(context); 21 22 Resources res = this.getContext().getResources(); 23 24 playBgImg1 = BitmapFactory.decodeResource(res, R.drawable.bgimg3); 25 26 timePaint.setColor(Color.BLUE); 27 timePaint.setTextSize(64); 28 timePaint.setAntiAlias(true); 29 } 30 31 @Override 32 public void onDraw(Canvas canvas){ 33 34 playBgImg1_1 = Bitmap.createScaledBitmap(playBgImg1, canvas.getWidth(), canvas.getHeight(), true); 35 36 playScene(canvas); 37 } 38 39 //プレイ画面 40 public void playScene(Canvas canvas){ 41 canvas.drawBitmap(playBgImg1_1, 0, 0, null); 42 } 43}

試したこと

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

timerA.scheduleで開始したタイマーを停止していないのが原因ですね。停止するコードを足してもいいですが、以下のようにpostDelayedを使う方法に変更してみてはどうでしょう?

//30秒経ったらリトライ画面へ移る Timer timerA = new Timer(false); timerA.schedule(new TimerTask() { public void run() { handlerA.post(new Runnable() { public void run() { remainedTime_A = TIME - (System.currentTimeMillis() - gameStarted) / 1000; if(remainedTime_A < 0){ setScreenRetry(); return; } } }); } }, 0, MSEC_A);

この部分のコードを以下に変えてください

// 30秒後に1度だけ処理を実行 handlerA.postDelayed(new Runnable() { public void run() { setScreenRetry(); } }, 30 * 1000);

投稿2018/06/16 08:41

kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hacchan

2018/06/17 05:04

ありがとうございます! 教えていただいたとおりにしたところ、意図したとおりに動きました! タイマーが止まっていたなかったのですね。。postDelayedも初めて知りました。 分かりやすい回答をありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問