編輯:關於Android編程
接上篇Android 開發第五彈:簡易時鐘(鬧鐘) ,這次是一個時鐘類應用,目前依舊是主要的功能,長得還是很挫。當然了,核心功能是有的……
先把簡單的時鐘給列出來吧,這裡都寫的很簡單,即便要用世界各個城市的話,也只是相應的加上或減去幾個小時。
新建TimeView類,並擴展自LinearLayout,然後布局文件和上一篇中那麼寫就好了。
// 實例化TextView控件
private TextView tvTime;
public TimeView(Context context) {
super(context);
}
public TimeView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TimeView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onFinishInflate(){
super.onFinishInflate();
tvTime = (TextView)findViewById(R.id.tvTime);
tvTime.setText(H);
timeHandler.sendEmptyMessage(0);
}
private Handler timeHandler = new Handler() {
public void handleMessage(Message msg){
// 刷新時間
refreshTime();
if(getVisibility() == View.VISIBLE){
timeHandler.sendEmptyMessageDelayed(0, 1000);
}
}
};
// 刷新時間
private void refreshTime(){
Calendar c = Calendar.getInstance();
// 試著顯示的時間格式
tvTime.setText(String.format(%d:%d:%d,
c.get(Calendar.HOUR_OF_DAY),
c.get(Calendar.MINUTE),
c.get(Calendar.SECOND)));
}
@Override
protected void onVisibilityChanged(View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
if(visibility == View.VISIBLE){
timeHandler.sendEmptyMessage(0);
}else{
timeHandler.removeMessages(0);
}
}
就這些了,下面正式開始計時器的部分。
TimerView類同樣是擴展自LinearLayout,並且布局的寫法也是如出一轍:
android:singleLine = true / >
< / LinearLayout>
先把該定義的都定義好了:
private Button btnStart, btnPause, btnResume, btnReset;
private EditText etHour, etMinute, etSecond;
private static final int MSG_WHAT_TIME_IS_UP = 1;
private static final int MSG_WHAT_TIME_TICK = 2;
// 所有時間計數
private int allTimerCount = 0;
private Timer timer = new Timer();
private TimerTask timerTask = null;
public TimerView(Context context) {
super(context);
}
public TimerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TimerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
核心部分,首先給各個按鈕設置監聽,其中的點擊分別實現相應的功能,並且設置相應的可見度,還要為每個EditText設置一個動態的判斷,使其值不大於59也不小於0。
@Override
protected void onFinishInflate(){
super.onFinishInflate();
// 暫停
btnPause = (Button)findViewById(R.id.btnPause);
btnPause.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
stopTimer();
btnPause.setVisibility(View.GONE);
btnResume.setVisibility(View.VISIBLE);
}
});
// 重置
btnReset = (Button)findViewById(R.id.btnReset);
btnReset.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
stopTimer();
etHour.setText(0);
etMinute.setText(0);
etSecond.setText(0);
btnReset.setVisibility(View.GONE);
btnResume.setVisibility(View.GONE);
btnPause.setVisibility(View.GONE);
btnStart.setVisibility(View.VISIBLE);
}
});
// 恢復
btnResume = (Button)findViewById(R.id.btnResume);
btnResume.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startTime();
btnResume.setVisibility(View.GONE);
btnPause.setVisibility(View.VISIBLE);
}
});
// 開始
btnStart = (Button)findViewById(R.id.btnStart);
btnStart.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startTime();
btnStart.setVisibility(View.GONE);
btnPause.setVisibility(View.VISIBLE);
btnReset.setVisibility(View.VISIBLE);
}
});
etHour = (EditText)findViewById(R.id.etHour);
etMinute = (EditText)findViewById(R.id.etMinute);
etSecond = (EditText)findViewById(R.id.etSecond);
// 對每一個EditText實例都作判斷,值不可以大於59或小於0
etHour.setText(00);
etHour.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!TextUtils.isEmpty(s)) {
int value = Integer.parseInt(s.toString());
if (value > 59) {
etHour.setText(59);
} else if (value < 0) {
etHour.setText(0);
}
}
checkToEnableBtnStart();
}
@Override
public void afterTextChanged(Editable s) {
}
});
etMinute.setText(00);
etMinute.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!TextUtils.isEmpty(s)) {
int value = Integer.parseInt(s.toString());
if (value > 59) {
etMinute.setText(59);
} else if (value < 0) {
etMinute.setText(0);
}
}
checkToEnableBtnStart();
}
@Override
public void afterTextChanged(Editable s) {
}
});
etSecond.setText(00);
etSecond.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(!TextUtils.isEmpty(s)){
int value = Integer.parseInt(s.toString());
if(value > 59){
etSecond.setText(59);
}else if(value < 0){
etSecond.setText(0);
}
}
checkToEnableBtnStart();
}
@Override
public void afterTextChanged(Editable s) {
}
});
btnStart.setVisibility(View.VISIBLE);
btnPause.setVisibility(View.GONE);
btnResume.setVisibility(View.GONE);
btnReset.setVisibility(View.GONE);
}
判斷是否可以開始計數,每個輸入框都不能小於等於0更不能為空。
// 判斷是否可以開始
private void checkToEnableBtnStart(){
btnStart.setEnabled((!TextUtils.isEmpty(etHour.getText())
&& Integer.parseInt(etHour.getText().toString()) > 0) ||
(!TextUtils.isEmpty(etMinute.getText())
&& Integer.parseInt(etMinute.getText().toString()) > 0) ||
(!TextUtils.isEmpty(etSecond.getText())
&& Integer.parseInt(etSecond.getText().toString()) > 0));
}
接下來就可以開始計時了。
// 開始
private void startTime(){
if(timerTask == null){
// 從三個輸入框中獲取需要計數的總秒數
allTimerCount = Integer.parseInt(etHour.getText().toString())*60*60
+ Integer.parseInt(etMinute.getText().toString())*60
+ Integer.parseInt(etSecond.getText().toString());
timerTask = new TimerTask() {
@Override
// 執行計數,allTimerCount自減
public void run() {
allTimerCount-- ;
handler.sendEmptyMessage(MSG_WHAT_TIME_TICK);
// 如果剩下的所有計數已經小於0,通知handler停止
if(allTimerCount <= 0){
handler.sendEmptyMessage(MSG_WHAT_TIME_IS_UP);
stopTimer();
}
}
};
// 設置scedule,開始時間以及時間間隔,間隔此處為1秒
timer.schedule(timerTask,1000,1000);
}
}
當然除了開始計時外,也需要能夠停止計時。
// 停止計時
private void stopTimer(){
if(timerTask != null){
timerTask.cancel();
timerTask = null;
}
}
接下來就是Handler了,也不算難,多寫幾遍就會了。
private Handler handler = new Handler() {
public void handleMessage(Message msg){
switch (msg.what){
case MSG_WHAT_TIME_TICK:
// 獲取時間
int hour = allTimerCount/60/60;
int min = (allTimerCount/60)%60;
int sec = allTimerCount%60;
// 將時間寫到對應的EditText上
etHour.setText(hour + );
etMinute.setText(min + );
etSecond.setText(sec + );
break;
case MSG_WHAT_TIME_IS_UP:
// 彈出對話框進行提示,包括標題、消息、返回按鈕
new AlertDialog.Builder(getContext()).setTitle(Time is up)
.setMessage(Message: Time is up)
.setNegativeButton(Cancel,null)
.show();
// 設置相應的可見與否
btnReset.setVisibility(View.GONE);
btnResume.setVisibility(View.GONE);
btnPause.setVisibility(View.GONE);
btnStart.setVisibility(View.VISIBLE);
break;
default:
break;
}
}
};
這是第二篇,還有一篇比較短的了, Android 開發第七彈:簡易時鐘(秒表)……
需要代碼的話,直接評論留郵箱吧,我就不上傳到CSDN資源了。代碼會繼續更新的,注釋也會繼續更新……
如果我們在文件浏覽器中點擊一個文件,然後點擊它,會彈出一個列表給你選擇 如果使自己的應用也出現在這個列表上,必須在menifest的這個act
Android系統中的很多安全類軟件都支持垃圾清理,但總有一些不知名文件夾能逃過類似功能的“洗禮”。那麼,我們如何根據一些蛛絲馬跡了
進入多核時代已經很久了,大數據概念也吵得沸沸揚揚,不管你喜歡不喜歡,不管你遇到沒遇到,big-data或bigger-data都必須正視.處理大數據,基本都
前面有文章曾經地介紹過MediaPlayer的基本用法,這裡就更加深入地講解MediaPlayer的在線播放功能。本文主要實現MediaPlayer在線播放音頻的功能,由