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

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

ただいまの
回答率

87.92%

textViewの表示に際してカウントアップさせたいのですが…

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,050

Javaを学習し始めて3カ月ぐらいですが、いろいろなサイトやブログを見てみたのですが、よくわからなかったので今回投稿させていた抱きました。
ストップウォッチの制作しているのですが、タイムの計測はうまくできているのですが、カウントアップで表記するやり方がイマイチ理解できていなくてどうやって表示させればいいのかわかっていない次第です。

handlerを使えばいいとは思うのですが、よくわかっていない部分が多くて困ってます。

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
long start;
long stop;
long stay;
long rapStop;
private boolean toggleSS;
long disPlayTimeMm;
long disPlayTimeSs;
long disPlayTimeMs;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toggleSS = false;



        findViewById(R.id.buttonSS).setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(v.getId() == R.id.buttonSS){

                            if (toggleSS == false) {
                                ((Button)findViewById(R.id.buttonSS)).setText("STOP");
                                ((Button)findViewById(R.id.buttonRR)).setText("RAP");
                                toggleSS = true;
                            }else{
                                ((Button)findViewById(R.id.buttonSS)).setText("START");
                                ((Button)findViewById(R.id.buttonRR)).setText("RESET");
                                toggleSS = false;
                            }
                            if(toggleSS == true && v.getId() == R.id.buttonSS){
                                start = System.nanoTime();//スタート時の時間を取得
                            }
                            if(toggleSS == false && v.getId() == R.id.buttonSS){
                                stop = System.nanoTime();//ストップさせた時間を取得
                                stay = stay + (stop - start);//ストップさせてからリスタートさても時間がそこから始まるように前の時間に今の時間を加算して出力
                                if((double)stay/1000/1000/1000 > 60){
                                    disPlayTimeMm = stay/1000/1000/1000/60;
                                }
                                disPlayTimeSs = stay/1000/1000/1000%60;
                                disPlayTimeMs = (stay - disPlayTimeMm*1000*1000*1000*60 - disPlayTimeSs*1000*1000*1000)/10000000;
                                ((TextView)findViewById(R.id.textView)).setText(String.valueOf(disPlayTimeMm + ":" + disPlayTimeSs + "." + disPlayTimeMs));
                            }
                        }
                    }
                }
        );

        findViewById(R.id.buttonRR).setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {//リセットを押したときでstayの中身を初期化
                        if(toggleSS == false && v.getId() == R.id.buttonRR){
                            ((TextView)findViewById(R.id.textView)).setText("00:00.00");
                            stay = 0;
                        }if(toggleSS == true && v.getId() == R.id.buttonRR){
                            rapStop = System.nanoTime();
                            stay = rapStop - start;
                            if((double)stay/1000/1000/1000 > 60){
                                disPlayTimeMm = stay/1000/1000/1000/60;
                            }
                            disPlayTimeSs = stay/1000/1000/1000%60;
                            disPlayTimeMs = (stay - disPlayTimeMm*1000*1000*1000*60 - disPlayTimeSs*1000*1000*1000)/10000000;
                            ((TextView)findViewById(R.id.textView)).setText(String.valueOf(disPlayTimeMm + ":" + disPlayTimeSs + "." + disPlayTimeMs));
                        }
                    }
                }
        );
    }
}


コードがものすごく拙いとは思いますが、よろしくお願いします。

追記です。
すいません。初めて投稿したので勝手がよくわからず、質問者として解答してもらう人の立場を考慮していなかったです。

現在の状況では、TextViewには00:00.00がResetをさせた時とonCreate時に記載させています。今のままのコードだと、textViewが動かないといいますか、スタートさせたときにtextViewが変動せずにボタンを押したときにタイムが出力される状態で、ボタンを押すまでtextViewは00:00.00のままなので、スタートを押した際にミリ秒・秒・分を0→1→2→3とカウントアップさせて表示させるように変更したいと思っています。

どのようにしたらカウントアップさせられるのかを教えてほしいです。
よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • yona

    2016/12/07 00:15

    コードだけ貼られても困りますね、このコードで現状どのような表示になるかを書いてください。理想と異なる事を具体的に書いてください。

    キャンセル

回答 1

0

handlerを使えばいいとは思うのですが

こんな感じで

@Override
    public void run() {

        while (!stopRun) {
            // sleep: period msec
            try {
                Thread.sleep(period);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
                stopRun = true;
            }

            handler.post(new Runnable() {
                @Override
                public void run() {
                    long endTime = System.currentTimeMillis();
                    // カウント時間 = 経過時間 - 開始時間
                    long diffTime = (endTime - startTime);

                    timerText.setText(dataFormat.format(diffTime));


                }
            });
        }
    }


Ref: https://akira-watson.com/android/system-currenttimemillis.html

Thread.sleep(period)で
int period = 10;
10msecを設定すれば10msecでカウントアップすることができます

この例ではSystem.currentTimeMillis()を使っていますが
System.nanoTime()の方が精度は高いですね、
ただそれがこの場合必要なのか、コスト高になっていないか等ありますが

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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