首页 > 代码库 > Android学习笔记_S01_E03_Chronometer(计时器)的使用

Android学习笔记_S01_E03_Chronometer(计时器)的使用

一、基本定义

  Chronometer(计时器)组件与DigitalClock都继承自TextView,因此他们都会显示一段文本。但Chrnometer并不显示当前时间,它显示的是从某个起始时间开始,一共过去了多长时间。

二、属性和方法

  1、属性:Chronometer(计时器)组件用法比较简单,它只提供了一个android:format属性,用于指定计时器的计时格式。

  2、方法:

方法 说明
setBase(long base)设置计时器的时间格式
setFormat(String format)设置显示时间的格式
start()开始计时
stop()停止计时
setOnChronemeterTickListener(Chronometer.OnChronometerTickListener listener)为计时器绑定事件监听器,当计时器改变时触发该监听器。

三、实现效果

  在文本框中输入计时秒数,按“开始”计时,计时结束时出现Toast提醒。如果无时间输入,则Toast提醒输入时间。计时途中可停止。

界面:。未输入时间提醒:。时间到的提醒,同时输入框重置:

 

四、代码编写

  1、XML文件中分别放入一个EditText、一个Chronometer和两个Button,并将EditText的输入类型设置为数字(android:inputType="number")。根据自己的喜好将控件摆放。(使用相对布局比较好点)。

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2     xmlns:tools="http://schemas.android.com/tools" 3     android:layout_width="match_parent" 4     android:layout_height="match_parent" 5     tools:context=".MainActivity" > 6      7     <EditText  8         android:id="@+id/time" 9         android:layout_width="match_parent"10         android:layout_height="wrap_content"11         android:inputType="number"12         android:hint="请输入计时秒数"/>13 14     <Chronometer 15         android:id="@+id/chronometer"16         android:layout_below="@id/time"17         android:layout_width="wrap_content"18         android:layout_height="wrap_content"19         android:layout_centerHorizontal="true"/>20 21     <Button22         android:id="@+id/start"23         android:layout_width="wrap_content"24         android:layout_height="wrap_content"25         android:layout_below="@+id/chronometer"26         android:text="开始计时" />27     28     <Button 29         android:id="@+id/stop"30         android:layout_width="wrap_content"31         android:layout_height="wrap_content"32         android:layout_below="@id/chronometer"33         android:layout_toRightOf="@id/start"34         android:text="停止"/>35        36 </RelativeLayout>
View Code

 

   2、在MainActivity中建立相应控件,并通过findViewById找到。

 1 private Button start,stop; 2     private Chronometer ch; 3     private EditText time; 4      5     @Override 6     protected void onCreate(Bundle savedInstanceState) { 7         super.onCreate(savedInstanceState); 8         setContentView(R.layout.activity_main); 9         10         start = (Button) findViewById(R.id.start);11         stop = (Button) findViewById(R.id.stop);12         ch = (Chronometer) findViewById(R.id.chronometer);13         time = (EditText) findViewById(R.id.time);
View Code

  3、建立两个监听器,ButtonListener实现onClickListener接口,ChListener实现OnChronometerTickListener接口。

  ButtonListener监听器用于监听start按钮和stop按钮。通过V.getId()判断按了哪个按钮。如果按了start按钮,通过判断EditText中的内容进行不同的操作:如果EditText为空则Toast提醒输入,如果EditText非空则设置计时器时间为系统时钟,并开始计时,同时start按钮不可用。如果按了stop按钮,则停止计时器并重置为系统时钟,清空EditText内容,设置start按钮可用。

  判断EditText内容的为空的语句是editText.getText().toString().trim().equals(""),其中trim()方法是拿到里面的东西后,把前后的空格都过滤掉;清空EditText内容的语句是time.setText("")。完整ButtonListene监听器类的代码如下:

 1 class ButtonListener implements OnClickListener{ 2  3         @Override 4         public void onClick(View v) { 5             if (v.getId() == R.id.start ) {             6                 if(time.getText().toString().trim().equals("")){ 7                     Toast.makeText(MainActivity.this, "请输入时间", Toast.LENGTH_SHORT).show(); 8                 }else { 9                     ch.setBase(SystemClock.elapsedRealtime());10                     ch.start();11                     start.setEnabled(false);                                        12                 }13             }else if(v.getId() == R.id.stop){                14                 ch.stop();15                 ch.setBase(SystemClock.elapsedRealtime());16                 time.setText("");17                 start.setEnabled(true);18             }                                                    19         }20     }
View Code

 

  ChListener监听器用于监听计时器。通过判断计时器当前时间(SystemClock.elapsedRealtime())与起始时间(通过getBase()方法获得)的差值控制计时器停止。首先新建一个int变量i,然后将EditText中的内容赋值给i。代码如下:

 1 int i = Integer.parseInt((EditText.getText().toString())); 

代码解析:通过EditText的.getText()方法获得内容,再通过toString()方法将其转成string类型。最后通过整型类里的parseInt(String)方法将string转成int类型。

  之后判断计时器的当前时间与起始时间的差值,如果大于i*1000(因为计时器是以毫秒为单位的),则停止计时器并Toast提醒,再重置计时器为系统时钟,清空EditText内容,设置start按钮可用。

完整ChListener监听器类代码如下:

 1 class ChListener implements OnChronometerTickListener{ 2  3         @Override 4         public void onChronometerTick(Chronometer chronometer) { 5             System.out.println("sys"+SystemClock.elapsedRealtime()); 6             System.out.println("base"+ch.getBase());             7             int i = Integer.parseInt((time.getText().toString()));                                                     8             if(SystemClock.elapsedRealtime() - ch.getBase() >i*1000){ 9                     ch.stop();10                     ch.setBase(SystemClock.elapsedRealtime());11                     Toast.makeText(MainActivity.this, "时间到了", Toast.LENGTH_SHORT).show();12                     time.setText("");13                     start.setEnabled(true);14             }                                                15         }        16     }
View Code

  4、新建ButtonListener监听器并分别绑定至start按钮和stop按钮,新建ChListener监听器并绑定至ch计时器。

1 ButtonListener listener = new ButtonListener();2 ChListener chListener = new ChListener();3 start.setOnClickListener(listener);    4 stop.setOnClickListener(listener);5 ch.setOnChronometerTickListener(chListener);            
View Code

 

五、源代码

   1、XML文件

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2     xmlns:tools="http://schemas.android.com/tools" 3     android:layout_width="match_parent" 4     android:layout_height="match_parent" 5     tools:context=".MainActivity" > 6      7     <EditText  8         android:id="@+id/time" 9         android:layout_width="match_parent"10         android:layout_height="wrap_content"11         android:inputType="number"12         android:hint="请输入计时秒数"/>13 14     <Chronometer 15         android:id="@+id/chronometer"16         android:layout_below="@id/time"17         android:layout_width="wrap_content"18         android:layout_height="wrap_content"19         android:layout_centerHorizontal="true"/>20 21     <Button22         android:id="@+id/start"23         android:layout_width="wrap_content"24         android:layout_height="wrap_content"25         android:layout_below="@+id/chronometer"26         android:text="开始计时" />27     28     <Button 29         android:id="@+id/stop"30         android:layout_width="wrap_content"31         android:layout_height="wrap_content"32         android:layout_below="@id/chronometer"33         android:layout_toRightOf="@id/start"34         android:text="停止"/>35        36 </RelativeLayout>
View Code

  2、MainActivity文件

 1 package com.example.chonometer; 2  3 import android.R.integer; 4 import android.hardware.input.InputManager; 5 import android.os.Bundle; 6 import android.os.SystemClock; 7 import android.app.Activity; 8 import android.view.Menu; 9 import android.view.View;10 import android.view.View.OnClickListener;11 import android.view.inputmethod.InputMethodManager;12 import android.widget.Button;13 import android.widget.Chronometer;14 import android.widget.EditText;15 import android.widget.TextView;16 import android.widget.Toast;17 import android.widget.Chronometer.OnChronometerTickListener;18 19 public class MainActivity extends Activity {20     21     private Button start,stop;22     private Chronometer ch;23     private EditText time;24     25     @Override26     protected void onCreate(Bundle savedInstanceState) {27         super.onCreate(savedInstanceState);28         setContentView(R.layout.activity_main);29         30         start = (Button) findViewById(R.id.start);31         stop = (Button) findViewById(R.id.stop);32         ch = (Chronometer) findViewById(R.id.chronometer);33         time = (EditText) findViewById(R.id.time);34         35         ButtonListener listener = new ButtonListener();36         ChListener chListener = new ChListener();37         start.setOnClickListener(listener);    38         stop.setOnClickListener(listener);39         ch.setOnChronometerTickListener(chListener);        40     }    41     42     class ButtonListener implements OnClickListener{43 44         @Override45         public void onClick(View v) {46             if (v.getId() == R.id.start ) {            47                 if(time.getText().toString().trim().equals("")){48                     Toast.makeText(MainActivity.this, "请输入时间", Toast.LENGTH_SHORT).show();49                 }else {50                     ch.setBase(SystemClock.elapsedRealtime());51                     ch.start();52                     start.setEnabled(false);                                        53                 }54             }else if(v.getId() == R.id.stop){                55                 ch.stop();56                 ch.setBase(SystemClock.elapsedRealtime());57                 time.setText("");58                 start.setEnabled(true);59             }                                                    60         }61     }62     63     class ChListener implements OnChronometerTickListener{64 65         @Override66         public void onChronometerTick(Chronometer chronometer) {67             System.out.println("sys"+SystemClock.elapsedRealtime());68             System.out.println("base"+ch.getBase());            69             int i = Integer.parseInt((time.getText().toString()));                                                    70             if(SystemClock.elapsedRealtime() - ch.getBase() >i*1000){71                     ch.stop();72                     ch.setBase(SystemClock.elapsedRealtime());73                     Toast.makeText(MainActivity.this, "时间到了", Toast.LENGTH_SHORT).show();74                     time.setText("");75                     start.setEnabled(true);76             }                                                77         }        78     }79 }
View Code

Android学习笔记_S01_E03_Chronometer(计时器)的使用