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     <Button
22         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     <Button
22         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     @Override
26     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         @Override
45         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         @Override
66         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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。