Секундомер - как?

Я пытался встроить секундомер в мое приложение, которое начинает рассчитывать по нажатию кнопки "Пуск". Я хочу, чтобы он считал от секунд, затем минут, а затем часов, но проблема в том, что я не могу считать час, но я могу считать миллисекунды, что я и делаю. не хочу. Возможно ли это при нажатии кнопки "Пуск", приложение берет текущее системное время, а при нажатии "Стоп" просто рассчитать и распечатать интервал между запусками и остановками?

Вот мой класс деятельности

package com.example.rimapps.stopwatch;

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

import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

    TextView textView;
    Button but1,but2;
    long MillisecondTIme,StarTime,TimeBuff,UpdateTime=0L;
    Handler handler;
    int MilliSeconds,Seconds,Minutes,Hour;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView=(TextView)findViewById(R.id.textView);
        but1=(Button)findViewById(R.id.buttonstart);
        but2=(Button)findViewById(R.id.buttonstop);

        handler = new Handler();

        but1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Date d=new Date();
                //SimpleDateFormat sdf=new SimpleDateFormat("hh:mm a");
                //String currentDateTimeString=sdf.format(d);
                //textView.setText(currentDateTimeString);

                StarTime=SystemClock.uptimeMillis();
                handler.postDelayed(runnable,0);
                //reset.setEnabled(false);

            }

        });
        but2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MillisecondTIme=0L;

                TimeBuff = 0L ;
                UpdateTime = 0L ;
                Seconds = 0 ;
                Minutes = 0 ;
                MilliSeconds = 0 ;
                textView.setText("00:00:00");

            }
        });

    }
    public Runnable runnable=new Runnable() {
        @Override
        public void run() {
            MillisecondTIme=SystemClock.uptimeMillis()-StarTime;
            UpdateTime=TimeBuff+MillisecondTIme;
            Seconds=(int)(UpdateTime/1000);
            Minutes=Seconds/60;
            Seconds=Seconds%60;
            MilliSeconds=(int)(UpdateTime%1000);

            textView.setText("" + Minutes + ":"
                    + String.format("%02d", Seconds) + ":"
                    + String.format("%03d", MilliSeconds));
            handler.postDelayed(this,0);

        }
    };

}

вот мой макет xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.rimapps.stopwatch.MainActivity">

        <TextView
            android:text="00:00:00"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textView"
            android:textSize="50dp"
            android:textStyle="bold"
            android:textColor="#009688"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="33dp" />

        <Button
            android:text="Start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="47dp"
            android:id="@+id/buttonstart"
            android:layout_below="@+id/textView"
            android:layout_alignLeft="@+id/textView"
            android:layout_alignStart="@+id/textView" />
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true">

            <Button
                android:text="Stop"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/buttonstop"

                android:layout_marginRight="89dp"
                android:layout_marginEnd="89dp"
                android:layout_marginTop="140dp"
                android:layout_alignParentTop="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true" />

        </RelativeLayout>
    </RelativeLayout>

2 ответа

Используйте sendMessage, у которого есть clearMessage вместо postRunnable

На этот раз я напишу для вас (больше всего для исправления соглашения с верблюдом):

Функция остановки находится на второй кнопке слушателя действия

package com.example.rimapps.stopwatch;

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

import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

    TextView textView;
    Button but1,but2;
    long millisecondTIme,starTime,timeBuff,updateTime=0L;
    Handler handler;
    int milliSeconds,seconds,minutes,hour;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView=(TextView)findViewById(R.id.textView);
        but1=(Button)findViewById(R.id.buttonstart);
        but2=(Button)findViewById(R.id.buttonstop);

        handler = new Handler() {
             public void handleMessage(Message what) {
                millisecondTIme=SystemClock.uptimeMillis()-starTime;
                updateTime=timeBuff+millisecondTIme;
                seconds=(int)(UpdateTime/1000);
                minutes=Seconds/60;
                seconds=Seconds%60;
                milliSeconds=(int)(updateTime%1000);

                textView.setText("" + minutes + ":"
                        + String.format("%02d", seconds) + ":"
                        + String.format("%03d", milliSeconds));
                handler.sendEmptyMessageDelayed(0, 1000); //repost in a loop
             }
        }

        but1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                starTime=SystemClock.uptimeMillis();
                handler.sendEmptyMessage(0); //Here send message with id 0
            }

        });
        but2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                millisecondTIme=0L;

                timeBuff = 0L ;
                updateTime = 0L ;
                seconds = 0 ;
                minutes = 0 ;
                milliSeconds = 0 ;
                textView.setText("00:00:00");
                handler.removeMessages(0); //Here clear all messages with same id

            }
        });
    }

}

Когда я изучал книгу, у меня также была проблема с кодированием секундомера, это пример кода, который я использую.

final Handler handler = new Handler();
        handler.post(new Runnable() {
            @Override
            public void run() {
                int hours=seconds/3600;
                int minutes=(seconds%3600)/60;
                int secs=seconds%60;
                String time = String.format("%d:%02d:%02d",hours,minutes,secs);
                timeView.setText(time);
                if(running)
                {
                    seconds++;
                }
                handler.postDelayed(this,1000);
            }
        });

также понимаю Handler class, обработчик всегда будет запускать код немедленно (как и каждую секунду навсегда), поэтому вам нужно добавить логическое значение, которое знает, работает ли он, а затем установить его на вашу кнопку, как если бы start Кнопка - это щелчок, который вы получили, чтобы установить значение true. Обработчик всегда будет работать вечно, как знаменитый loop() метод Arduino (он работает вечно).

Другие вопросы по тегам