计时器 - H:MM:SS格式

7
如何显示格式为H:MM:SS的计时器?我了解到默认情况下只能显示格式为MM:SS和H:MM:SS的计时器。但是我只找到了MM:SS的代码。
以下是我用于带有开始和停止按钮的MM:SS计时器的代码:
public class MainActivity extends AppCompatActivity {

Button start,stop;
Chronometer chrono;
long time;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    start = (Button) findViewById(R.id.start);
    stop = (Button) findViewById(R.id.stop);
    chrono = (Chronometer) findViewById(R.id.chronometer);

 start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

           chrono.setBase(SystemClock.elapsedRealtime());


            chrono.start();
        }
    });

    stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            chrono.stop();

        }
    });


}

}

这是我 MainActivity 的 XML 代码:

    <Chronometer
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/chronometer"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Start"
    android:id="@+id/start"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Stop"
    android:id="@+id/stop"
    android:layout_below="@+id/start"
    android:layout_centerHorizontal="true" />
4个回答

19

H:MM:SS计时器

使用setOnChronometerTickListener将时间分为分钟、小时和秒钟

使用以下代码......

Chronometer chrono  = (Chronometer) findViewById(R.id.chronomete);
chrono.setOnChronometerTickListener(new OnChronometerTickListener(){
        @Override
            public void onChronometerTick(Chronometer chronometer) {
            long time = SystemClock.elapsedRealtime() - chronometer.getBase();
            int h   = (int)(time /3600000);
            int m = (int)(time - h*3600000)/60000;
            int s= (int)(time - h*3600000- m*60000)/1000 ;
            String t = (h < 10 ? "0"+h: h)+":"+(m < 10 ? "0"+m: m)+":"+ (s < 10 ? "0"+s: s);
            chronometer.setText(t);
        }
    });
    chrono.setBase(SystemClock.elapsedRealtime());
    chrono.setText("00:00:00");

output

编辑

开始前

全局声明一个长整型变量 timeWhenStopped。它将维护时间。

private long timeWhenStopped = 0;

开始监听... 获取 timeWhenStopped 并从那里开始。

 start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            chrono.setBase(SystemClock.elapsedRealtime() + timeWhenStopped);
            chrono.start();
        }
    }); 

停止监听...将时间存储在timeWhenStopped中并停止。

stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            timeWhenStopped = chrono.getBase() - SystemClock.elapsedRealtime();
            chrono.stop();

        }
    });

喜欢编码……


请检查编辑后,让我知道是否有任何问题。 - sushildlh
将代码中的 chrono.setBase(SystemClock.elapsedRealtime()); 修改为 chrono.setText("00:00:00"); - sushildlh
嗨,最后我在计时器内部的XML中找到了一种方法:android:format="00:00:00"。打开应用程序时它会显示00:00:00。感谢您的帮助。今天我感到非常高兴,因为有了您的代码。我可以问一个最后的问题吗? - Rathi J
1
不确定那是什么? - sushildlh
1
移除 timeWhenStopped 变量... 并在开始按钮中将其设置为 chrono.setBase(SystemClock.elapsedRealtime()) - sushildlh
显示剩余15条评论

0
请使用这个逻辑。
 long countUp = (SystemClock.elapsedRealtime() - chronometer.getBase()) / 1000;
 long sec = countUp % 60;
 long temp=countUp / 60;
 long mins = (temp)%60;
 long hrs = temp / 60;

0

您还可以设置具有吸引力的计时器格式,例如00小时:00分钟:00秒

        chronometer.setText("00 hrs : 00 min : 00 sec");
        chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {

            @Override
            public void onChronometerTick(Chronometer chronometer) {
                CharSequence text = chronometer.getText();
                if (text.length() == 5) {
                    String a[] = text.toString().split(":");
                    String min = a[0] + " min : ";
                    String sec = a[1] + " sec";
                    chronometer.setText("00 hrs : " + min + sec);
                } else if (text.length() == 7) {
                    String a[] = text.toString().split(":");
                    String hr = a[0] + " hrs : ";
                    String min = a[1] + " min : ";
                    String sec = a[2] + " sec";
                    chronometer.setText("0" + hr + min + sec);
                }
            }
        });

0

layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
    android:id="@+id/tv_data"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

<Chronometer
    android:id="@+id/chronometer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/tv_data"
    android:layout_centerInParent="true" />

在活动中

import java.util.Calendar;
import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.text.format.DateFormat;
import android.widget.Chronometer;
import android.widget.Chronometer.OnChronometerTickListener;
import android.widget.TextView;

public class MainActivity extends Activity {

    TextView tvData;
    Chronometer chronometer;

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

        tvData = (TextView) findViewById(R.id.tv_data);
        chronometer = (Chronometer) findViewById(R.id.chronometer);

        startChronometer();

        chronometer.setOnChronometerTickListener(new OnChronometerTickListener() {
            public void onChronometerTick(Chronometer cArg) {
                Calendar calendar = Calendar.getInstance();
                calendar.set(Calendar.HOUR_OF_DAY, 0);
                calendar.set(Calendar.MINUTE, 0);
                calendar.set(Calendar.SECOND, 0);
                calendar.set(Calendar.MILLISECOND, getCurrentMiliSecondsOfChronometer());
                tvData.setText(DateFormat.format("HH:mm:ss", calendar.getTime()));
            }
        });
    }

    private int getCurrentMiliSecondsOfChronometer() {
        int stoppedMilliseconds = 0;
        String chronoText = chronometer.getText().toString();
        String array[] = chronoText.split(":");
        if (array.length == 2) {
            stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 1000 + Integer.parseInt(array[1]) * 1000;
        } else if (array.length == 3) {
            stoppedMilliseconds =
                    Integer.parseInt(array[0]) * 60 * 60 * 1000 + Integer.parseInt(array[1]) * 60 * 1000
                            + Integer.parseInt(array[2]) * 1000;
        }
        return stoppedMilliseconds;
    }

    private void startChronometer() {
        int stoppedMilliseconds = getCurrentMiliSecondsOfChronometer();
        chronometer.setBase(SystemClock.elapsedRealtime() - stoppedMilliseconds);
        chronometer.start();
    }
}

你的 XML 代码中没有 TextView。:( 我是初学者,请完整地解释一下。 - Rathi J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接