我一直在努力为Android编写一个简单的数字时钟应用。首先,我使用内置的数字时钟,并试图省略秒显示,但我不能。我希望时钟的秒数可以触发我的一些代码行。
然后我开始开发简单的应用程序将Digits放在屏幕上,但我不知道如何以最有效的方式触发显示。任何人都可以给我一个简单的开始,在哪里看,以及使用什么功能?如何在每秒内执行几行代码?我在Display the current time and date in an Android application尝试了这个例子,但没有成功。没有名为CountDownRunner的库可以导入。
我是Android开发的新手,但我在Java,C,C ++方面有相当不错的经验。
谢谢
答案 0 :(得分:8)
这是一个简单的时钟,我使用Android本机DigitalClock.java和AnalogClock.Java类中使用的方法开发。此时钟支持每秒或每分钟触发的事件,因此您可以使用这些事件并运行你的代码。
- StartTickPerSecond()方法使用DigitalClock.java中使用的方法来获取每秒的滴答。
- StartTickPerMinute()方法使用AnalogClock.java中使用的方法获取每分钟刻度
醇>
这仍然可能需要一些修改..但希望这将是你开始的东西..
的 Clock.java 强>
package com.sample.data;
import java.util.*;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.SystemClock;
import android.text.format.Time;
public class Clock
{
public static final int TICKPERSECOND=0;
public static final int TICKPERMINUTE=1;
private Time Time;
private TimeZone TimeZone;
private Handler Handler;
private List<OnClockTickListner> OnClockTickListenerList = new ArrayList<OnClockTickListner>();
private Runnable Ticker;
private BroadcastReceiver IntentReceiver;
private IntentFilter IntentFilter;
private int TickMethod=0;
Context Context;
public Clock(Context context)
{
this(context, Clock.TICKPERMINUTE);
}
public Clock(Context context,int tickMethod)
{
this.Context=context;
this.TickMethod=tickMethod;
this.Time=new Time();
this.Time.setToNow();
switch (TickMethod)
{
case 0:
this.StartTickPerSecond();
break;
case 1:
this.StartTickPerMinute();
break;
default:
break;
}
}
private void Tick(long tickInMillis)
{
Clock.this.Time.set(Clock.this.Time.toMillis(true)+tickInMillis);
this.NotifyOnTickListners();
}
private void NotifyOnTickListners()
{
switch (TickMethod)
{
case 0:
for(OnClockTickListner listner:OnClockTickListenerList)
{
listner.OnSecondTick(Time);
}
break;
case 1:
for(OnClockTickListner listner:OnClockTickListenerList)
{
listner.OnMinuteTick(Time);
}
break;
}
}
private void StartTickPerSecond()
{
this.Handler=new Handler();
this.Ticker = new Runnable()
{
public void run()
{
Tick(1000);
long now = SystemClock.uptimeMillis();
long next = now + (1000 - now % 1000);
Handler.postAtTime(Ticker, next);
}
};
this.Ticker.run();
}
private void StartTickPerMinute()
{
this.IntentReceiver= new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
Tick(60000);
}
};
this.IntentFilter = new IntentFilter();
this.IntentFilter.addAction(Intent.ACTION_TIME_TICK);
this.Context.registerReceiver(this.IntentReceiver, this.IntentFilter, null, this.Handler);
}
public void StopTick()
{
if(this.IntentReceiver!=null)
{
this.Context.unregisterReceiver(this.IntentReceiver);
}
if(this.Handler!=null)
{
this.Handler.removeCallbacks(this.Ticker);
}
}
public Time GetCurrentTime()
{
return this.Time;
}
public void AddClockTickListner(OnClockTickListner listner)
{
this.OnClockTickListenerList.add(listner);
}
}
<强> OnClockTickListner.java 强>
public interface OnClockTickListner {
public void OnSecondTick(Time currentTime);
public void OnMinuteTick(Time currentTime);
}
如何使用
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.clock_list_item);
Clock c=new Clock(this);
c.AddClockTickListner(new OnClockTickListner() {
@Override
public void OnSecondTick(Time currentTime) {
Log.d("Tick Test per Second",DateFormat.format("h:mm:ss aa ", currentTime.toMillis(true)).toString());
}
@Override
public void OnMinuteTick(Time currentTime) {
Log.d("Tick Test per Minute",DateFormat.format("h:mm aa", currentTime.toMillis(true)).toString());
}
});
}
}
答案 1 :(得分:0)
查看DigitalClock小部件的源代码。特别是,请查看创建Runnable以处理1秒'ticks'的onAttachedToWindow()
方法。