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

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

ただいまの
回答率

90.74%

  • Java

    13122questions

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

  • Android

    6213questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3465questions

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

Handler 一定時間後に処理をしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 221

S.I

score 28

アプリ作成中です。画面横向き設定。
画面左側はアニメーションが動きます。
画面右側は操作・問題画面。計6つ(上・下・左・右・スタート・やり直し)のボタンで操作。

<実現したいこと>
「せいかい!」・「ざんねん!」のアラートダイアログの発生を数秒遅らせること

<試したこと>
Handlerを用いて処理を遅延させようとしたが,

new Handler().postDelayed(new Runnable() {

のHandlerという部分に赤文字エラーが発生してしまった。(エラー内容:Cannot resolve symbol 'Handler')

public class MainActivity extends AppCompatActivity implements Animator.AnimatorListener {

    final static float TRANSLATE_X = 310.0f;    // 1回の操作でX軸方向にいくつ動かすか
    final static float TRANSLATE_Y = 310.0f;    // 1回の操作でY軸方向にいくつ動かすか

    // 盤面上の開始座標を初期値として設定する
    private int x = 0;
    private int y = 0;
    private String text;
    private ArrayList<Integer> History;   // 履歴を格納するリスト
    private boolean ReplayFlag;         // 再生中であることを示すフラグ
    private int ReplayCount;            // 再生経過のカウンター

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn1 = (Button) findViewById(R.id.button1);  // うえ
        Button btn2 = (Button) findViewById(R.id.button2);  // した
        Button btn3 = (Button) findViewById(R.id.button3);  // ひだり
        Button btn4 = (Button) findViewById(R.id.button4);  // みぎ
        Button btn5 = (Button) findViewById(R.id.button5);  // やりなおし
        Button btn6 = (Button) findViewById(R.id.button6);  // スタート

        text = "";
        final TextView result = (TextView) findViewById(R.id.result);
        result.setText("");

        // 初期値をセット
        History = new ArrayList<>();
        ReplayFlag = false;
        ReplayCount = 0;


        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // 「うえ」を押したときの処理
                /*if (y > -3) {*/
                TextView result = (TextView) findViewById(R.id.result);
                text += "<font color=#98fb98><b>↑</b></font>";
                result.setText(Html.fromHtml(text));
                History.add(0); // 0は上を意味する
            }
        });
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // 「した」を押したときの処理
                /*if (y < 0) {*/
                TextView result = (TextView) findViewById(R.id.result);
                text += "<font color=#ffff99><b>↓</b></font>";
                result.setText(Html.fromHtml(text));
                History.add(1); // 1は下を意味する
            }
        });
        btn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // 「ひだり」を押したときの処理
                /*if (x > 0) {*/
                TextView result = (TextView) findViewById(R.id.result);
                text += "<font color=#ffc0cb><b>←</b></font>";
                result.setText(Html.fromHtml(text));
                History.add(2); // 2は左を意味する
            }
        });
        btn4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // 「みぎ」を押したときの処理
                /*if (x < 2) {*/
                TextView result = (TextView) findViewById(R.id.result);
                text += "<font color=#afeeee><b>→</b></font>";
                result.setText(Html.fromHtml(text));
                History.add(3); // 3は右を意味する
            }
        });
        btn5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                x = 0;
                y = 0;
                animationImageReset();
                History.clear();

                text = "";
                TextView result = (TextView) findViewById(R.id.result);
                result.setText("");
            }
        });
        btn6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // isEmpty()でリストが空っぽではない(1手以上の記録がある)か調べる
                if (!History.isEmpty()) {
                    // 猫を最初の位置に戻す
                    x = 0;
                    y = 0;
                    animationImageReset();


                    ReplayFlag = true;  // 再生中にする
                    animationReplay();     // 再生する(ここでは1手目だけ、以後はonAnimationEndに任せる)
                }
            }
        });
    }

    private void animationImageView(String property, float start, float end) {
        ImageView imageView = (ImageView) findViewById(R.id.MyCat);
        ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, property, start, end);
        animator.setDuration(1000);
        animator.addListener(this);
        animator.start();
    }

    private void animationImageReset() {
        final ImageView MyCat = (ImageView) findViewById(R.id.MyCat);
        ObjectAnimator.ofFloat(MyCat, "translationX", 0.0f, 0.0f).start();
        ObjectAnimator.ofFloat(MyCat, "translationY", 0.0f, 0.0f).start();
    }

    private void encountDog() {
        if (x == 1 && y == -2) {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    AlertDialog.Builder dl = new AlertDialog.Builder(MainActivity.this);
                    dl.setTitle("ざんねん!!");
                    dl.setMessage("いぬはしょうがいぶつだよ");
                    dl.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            x = 0;
                            y = 0;
                            animationImageReset();
                            History.clear();

                            text = "";
                            TextView result = (TextView) findViewById(R.id.result);
                            result.setText("");
                        }
                    });
                    dl.show();

                }
            }, 1000);

        }
        if (x == 2 && y == -3) {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    AlertDialog.Builder dl = new AlertDialog.Builder(MainActivity.this);
                    dl.setTitle("せいかい!!");
                    dl.setPositiveButton("こたえ", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            AlertDialog.Builder dl = new AlertDialog.Builder(MainActivity.this);
                            dl.setTitle("こたえ");
                            dl.setMessage("①→→↑↑↑②↑↑↑→→③→↑→↑↑など");
                            dl.setPositiveButton("つぎのもんだいへすすむ", null);
                            dl.show();
                        }
                    });
                    dl.setNegativeButton("つぎのもんだいへすすむ", null); //ボタン
                    dl.setNeutralButton("プログラムのかいせつ",null);
                    dl.show();

                }
            }, 1000);
        }
    }

    private void animationReplay() {
        if (ReplayFlag) {
            int dir = History.get(ReplayCount); // リストから取り出し

            switch (dir) {
                case 0:  // 0は上を意味する
                    upAnimation();
                    break;
                case 1:  // 1は下を意味する
                    downAnimation();
                    break;
                case 2:  // 2は左を意味する
                    leftAnimation();
                    break;
                case 3:  // 3は右を意味する
                    rightAnimation();
                    break;
            }

            ReplayCount++;  // カウンターを増やす

            // 再生終了したらフラグをクリアする
            if (ReplayCount == History.size()) {
                ReplayFlag = false;
                ReplayCount = 0;
            }
            if (x == 1 && y == -2) {
                ReplayFlag = false;
                ReplayCount = 0;
            }
        }
    }

    @Override
    public void onAnimationStart(Animator animation) {
    }

    @Override
    public void onAnimationEnd(Animator animation) {
        // アニメーションが終了するとここが実行される
        if (ReplayFlag) {
            animationReplay();    // 再生する
        }
    }

    @Override
    public void onAnimationCancel(Animator animation) {
    }

    @Override
    public void onAnimationRepeat(Animator animation) {
    }

    private void upAnimation() {
        // 「うえ」を押したときの処理
        if (y > -3) {
            float start = TRANSLATE_Y * y;
            float end = start - TRANSLATE_Y;
            animationImageView("translationY", start, end);
            y--;
            encountDog();
        }
    }

    private void downAnimation() {
        // 「した」を押したときの処理
        if (y < 0) {
            float start = TRANSLATE_Y * y;
            float end = start + TRANSLATE_Y;
            animationImageView("translationY", start, end);
            y++;
            encountDog();
        }
    }

    private void leftAnimation() {
        // 「ひだり」を押したときの処理
        if (x > 0) {
            float start = TRANSLATE_X * x;
            float end = start - TRANSLATE_X;
            animationImageView("translationX", start, end);
            x--;
            encountDog();
        }
    }

    private void rightAnimation() {
        // 「みぎ」を押したときの処理
        if (x < 2) {
            float start = TRANSLATE_X * x;
            float end = start + TRANSLATE_X;
            animationImageView("translationX", start, end);
            x++;
            encountDog();
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • shikasama

    2018/01/16 15:14

    android.os.Handlerはimportされていますでしょうか?

    キャンセル

回答 1

checkベストアンサー

+1

HandlerというクラスはJava言語とAndroid SDKの両方に存在するため、Android Stuidoにとってはどちらを使おうとしているのか判断できないために、自動インポートなども効きません。そのためにエラーになっているもので、適切なimportを行うことで回避できるでしょう。

赤字になっている箇所でAltキーを押しながらEnterキーを押すと、エラーの解決法の候補が提示されます。その中からImport classを選択すると、下図のようにどちらをimportするか選択肢が出ます。ここで必要になるのはAndroid SDKが提供するHandlerですからandroid.osの方(上側)を選択します。

Android Studioでは、エラーのために赤字表示されている箇所でAlt+Enterキーを押すという操作は、様々な場面に応用が効くので、覚えておくと便利でしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/16 22:19

    ありがとうございます!

    キャンセル

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

  • ただいまの回答率 90.74%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13122questions

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

  • Android

    6213questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3465questions

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