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-3253 Fence Repair---Huffman贪心
题目链接: https://vjudge.net/problem/POJ-3253 题目大意: 有一个农夫要把一个木板钜成几块给定长度的小木板,每次锯都要收取一定费用,这个费用就是当前锯的这个木版的长 ...
- url的解码方式
#coding:utf-8 import urllib legal_person_string = "%E6%B3%95%E5%AE%9A%E4%BB%A3%E8%A1%A8%E4%BA%B ...
- html如何实现的
超文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分.网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览器如何显示其中的 ...
- 三层架构和MVC一样吗?(区别)
首先声明:1.三层架构绝不是MVC(不一样滴) 2.三层架构可以应用于任何语言.任何技术的应用程序. 3.而MVC只是为了解决BS应用程序视图各部分的耦合关系:他们 ...
- SQL to Java code for Elasticsearch
Elasticsearch虽然定位为Search Engine,但是因其可以持久化数据,很多时候,我们把Elasticsearch当成Database用,但是Elasticsearch不支持SQL,就 ...
- Windows使用Gitblit搭建Git服务器
安装之前需确定安装JAVA运行环境. 下载安装 首先到 Gitblit官网 下载安装包.此处使用的版本是1.8.0. 将解压得到的gitblit-1.8.0文件夹放于C:\gitServer目录下. ...
- C#之FTP上传下载(一)
搭建FTP服务器 最近要实现这样一个功能:FTP服务器的上传和下载,搜集了一些资料,在c播客上看到昵称为"傻丫头和科技"的作者写的一篇文章写得挺好,有的地方个人觉得不是很详细,自己 ...
- 前端之旅HTML与CSS篇之自己总结的关于居中的方法
1.text-align:center :在父容器里水平居中 inline 文字,或 inline 元素 2.line-height 与 height 相等时,垂直居中文字(文字垂直水平居中,同时 ...
- java====color、font、button、label、textfield、textarea使用
1. Color类 µ 公共静态属性:共13个静态属性,分别代表13种不同的颜色常量. µ 构造函数 ü public Color(int r,int g,int b):以整数形式给出红.绿.蓝三个分 ...
- 发布你的程序包到Nuget
1.新建一个.NET Standard 的类库项目 2.选择项目熟悉,在 package 栏目下填写我们的nuget包信息 3.选择我们的项目,点击"Pack" 打包 主要注意的是 ...