Android简易实战教程--第五十一话《使用Handler实现增加、减少、暂停计数》
转载博客请注明出处:道龙的博客
之前,写过一篇使用异步任务AysncTask实现倒计时的小案例,喜欢的话可以参考博客:Android简易实战教程--第三十三话《 AsyncTask异步倒计时》。
本篇在此基础上,使用Handler实现一些顺序计数以及倒叙计数。本篇小案例基本涵盖Handler使用场景还值得推敲哒~
喜欢的朋友可以关注本专栏,专栏会持续更新下去,而且文章会越来越标准化。案例简单,轻松阅读。
博客只会给出核心代码和解析,全部代码可自行下载。
本篇源代码下载GitHub地址,开启代码传送门---------->>>https://github.com/codeydl/MyApplication
先看一下需求分析,我们最后实现什么样的功能:
1. 初始时
显示10,可以通过点击按钮改变其值,即“手动增加1”
2. 点击“自动增加”
每隔1S上面的文本数值增加1,但最大显示20并作出提示
3. 点击“自动减少”
每隔1S上面的文本数值减少1,但最小显示1并作出提示
4. 点击“暂停”
上面的数值文本不再变化
接下来就跟着文章一步步的实现
一、初始时显示10,可以通过点击按钮改变其值,即“手动增加”
我们获取到布局文件中的所有实例后。按钮实现点击事件,重写onClick()方法:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_demo_increase:
mHandler.sendEmptyMessage(MES_WHAT_INCREASE);
break;
case R.id.btn_demo_decrease:
mHandler.sendEmptyMessage(MES_WHAT_DECREASE);
break; case R.id.btn_demo_pause: break; default:
break;
}
}
增加按钮和减少按钮,都发一条空消息,携带waht字段以区分是哪个位置发送的消息。此时Handler的HandlerMesage回调方法被调用,在此做数据的而改变,UI的更新:
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MES_WHAT_INCREASE:
number ++;
tvdemonumber.setText(number+"");
break;
case MES_WHAT_DECREASE:
number --;
tvdemonumber.setText(number+"");
break;
default:
break;
}
}
};
实现效果如下图所示:
二、点击一次“自动增加”,每隔1S上面的文本数值增加1,但最大显示20并作出提示;点击“自动减少”每隔1S上面的文本数值减少1,但最小显示1并作出提示;点击“暂停”,上面的数值文本不再变化
使用Handler发送延时1s的消息,为了实现每隔一秒就发送一条消息,在接收消息的地方在发送一条消息给自己。这样就巧妙的实现了1秒钟刷新一次UI了。代码如下:
case MES_WHAT_INCREASE:
......
tvdemonumber.setText(number+"");
//实现循环发送消息。执行完UI刷新后,再一次调用sendEmptyMessageDelayed方法,隔1s发送一条消息给自己。从而实现了隔1s值增加1
mHandler.sendEmptyMessageDelayed(MES_WHAT_INCREASE,1000);
break;
或者倒计时的时候:
case MES_WHAT_DECREASE:
......
//发消息给自己,原理同上边
mHandler.sendEmptyMessageDelayed(MES_WHAT_DECREASE,1000);
break;
这个时候运行程序:
开始可以实现自动增加,但是再点击减少的时候,发现卡住了。原因在于,我们在多个位置处发送了消息,增加的按钮和减少的按钮,都放松了消息。而且点击增加,若再点击减少,消息会不断的重复进入handlMessage方法中。一处要UI更新是增加另一UI更新是减少。这样就好像是卡住了。因此在点击增加要消息清理掉减少按钮发送的消息,点击减少按钮同样清理掉增加按钮的消息。
case R.id.btn_demo_increase:
//清理掉减少扫按钮发送的消息
mHandler.removeMessages(MES_WHAT_DECREASE);
//发消息(增加)
mHandler.sendEmptyMessage(MES_WHAT_INCREASE);
break;
case R.id.btn_demo_decrease:
//清理掉增加按钮发送的消息
mHandler.removeMessages(MES_WHAT_INCREASE);
//发消息(减少)
mHandler.sendEmptyMessage(MES_WHAT_DECREASE);
break;
判断上限20,下限1:
在处理消息的地方,在1或者20的地方,做出判断,并移除消息。
if(number == 20){
//移除消息
mHandler.removeMessages(MES_WHAT_INCREASE);
Toast.makeText(getApplicationContext(),"已经最大值",Toast.LENGTH_SHORT).show();
return;
}
或者:
if(number == 1){
//停止移除消息
mHandler.removeMessages(MES_WHAT_DECREASE);
Toast.makeText(getApplicationContext(),"已经最小值",Toast.LENGTH_SHORT).show();
return;
}
以及加入暂停效果:
三、加入按钮可操作性:
最后,也是比较关键的地方发。我们点击增加,就要屏蔽增加按钮效果;点击减少,屏蔽减少效果;到上限或者下限按钮又可用,但是暂停按钮不可用;
比如在点击了增加按钮后,可以这么写:使得增加按钮为不可用,不要再次点击
//限制Button可操作性
btndemoincrease.setEnabled(false);
btndemodecrease.setEnabled(true);
btndemopause.setEnabled(true);
再比如,上限时候,设置:使得暂停按钮和自动增加按钮设置不可用,表示已经到上限了不需要暂停也不需要增加。
if(number == 20){
//限制Button可操作性
btndemoincrease.setEnabled(false);
btndemodecrease.setEnabled(true);
btndemopause.setEnabled(false);
..........................
}
最后运行效果如下:
喜欢的话可以关注我博客,有问题大家一起交流。也可以动手微信扫描下方二维码查看更多安卓文章:
打开微信搜索公众号 Android程序员开发指南 或者手机扫描下方二维码 在公众号阅读更多Android文章。
微信公众号图片:
Android简易实战教程--第五十一话《使用Handler实现增加、减少、暂停计数》的更多相关文章
- Android简易实战教程--第五十话《动画扫描》
祝新年快乐!2017(一起)前行. 转载博客请注明出处:道龙的博客 本篇简答的小案例,使用动画知识,完成一个类似雷达扫描效果,并且加入自定义进度条.对于自定义进度条前面有很详细的解析和案例了,本篇就结 ...
- Android简易实战教程--第三十一话《自定义土司》
最近有点忙,好几天不更新博客了.今天就简单点,完成自定义土司. 主布局文件代码: <RelativeLayout xmlns:android="http://schemas.andro ...
- Android简易实战教程--第四十八话《Android - Timer、TimerTask和Handler实现倒计时》
之前本专栏文章中的小案例有写到:第三十九话<Chronometer实现倒计时> 以及使用异步实现倒计时:第三十三话< AsyncTask异步倒计时> 本篇文章 结合Timer. ...
- Android简易实战教程--第三十五话《音乐播放》
已经好几天不更新博客了,今天轻松一点模拟个简单的"音乐播放器".1分钟看完~ 整个简单布局,加几个控制按钮: <LinearLayout xmlns:android=&quo ...
- Android简易实战教程--第四十五话《几种对话框》
Android中提供了各种原生的对话框,在使用简单的功能的时候,还不比考虑自定义,使用原生的也能完成功能.本篇简单小案例就介绍三种对话框. 还是直接上代码吧: 布局中三个点击事件的按钮: <Li ...
- Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》
Android5.X后,引入了RecyclerView,这个控件使用起来非常的方便,不但可以完成listView的效果,而且还可以实现ListView无法实现的效果.当然,在新能方便也做了大大的提高. ...
- Android简易实战教程--第四十二话《Spinner下拉级联效果》
本篇承接第四十话第四十话<Spinner> 参考博客:http://blog.csdn.net/yayun0516 进入正题: Strings加入第一级数据: <string-arr ...
- Android简易实战教程--第三十六话《电话录音》
今天完成一个简单的电话录音功能,即接通电话后,立即录下自己打电话的声音.实现起来比较简单:一个服务,一个TelephonyManager.一个MediaRecorder就够了. 1.布局提供一个开启录 ...
- Android简易实战教程--第三十二话《使用Lrucache和NetworkImageView加载图片》
转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:小杨的博客 http://blog.csdn.net/qq_32059827/article/details/5279131 ...
随机推荐
- POJ-2184 Cow Exhibition---01背包变形(负数偏移)
题目链接: https://vjudge.net/problem/POJ-2184 题目大意: 给出num(num<=100)头奶牛的S和F值(-1000<=S,F<=1000),要 ...
- hdu2062 Subset sequence----递推
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2062 题目大意: 给出n和m,集合{1,2,,,,n}的非空子集,按照一定方式排列,例如n==3时, ...
- C++因继承引发的隐藏与重写
在区分隐藏和重写之前,先来理一理关于继承的东西... [继承] 继承是面向对象复用的重要手段.通过继承定义一个类,继承是类型之间的关系建模,共享公有的东西,实现各自本质不同的东西.简单的说,继承就是指 ...
- Plupload 上传控件使用指南
本文转载至(感谢原作者分享):http://www.cnblogs.com/2050/p/3913184.html#plupload_doc2 我之前写过一篇文章<文件上传利器SWFUpload ...
- 【Swift】swift定义全局变量
swift定义全局变量非常简单哈,只要在类class上面直接定义,就是全局变量了 当需要在类里面定义一个类函数访问的变量的时候,直接在var或者let 前面加一个 static
- CSS常用字体属性(多出的文本隐藏,或者以省略号的形式显示)和背景样式以及背景图的2个不常用属性:background-origin和background-clip
(一)常用的字体属性: font-weight: 属性值100-900 400等于正常 700等于bold ,数值越大,越粗 font-size:字体大小,单位可以为px或者% font-famil ...
- 第三届“百越杯”福建省高校网络空间安全大赛_Do you know upload?
题目在i春秋的ctf训练营 既然是上传,那就直接抓包 二话不说上来先给个00截断传个一句话助助兴 直接就成功了.... 赶紧操起菜刀去连接 进去之后发现ctf.sql是个空文件,那么flag应该在数据 ...
- python文件结构与import用法
首先上一张总结图: 在pycharm中,一般不会将当前文件目录自动加入自己的sourse_path.如果遇到无法import同级目录下的其他模块, 右键make_directory as-->S ...
- [POI 2007]ZAP-Queries
Description Byteasar the Cryptographer works on breaking the code of BSA (Byteotian Security Agency) ...
- [LOJ 6270]数据结构板子题
Description 有n个区间,第i个区间是[li,ri],它的长度是ri−li. 有q个询问,每个询问给定L,R,K,询问被[L,R]包含的且长度不小于K的区间数量. 你想,像这种板子题,你随手 ...