目前为止,有很多地方都需要绑定用户手机号,发送短信,比如说找回密码,注册或者登陆,这些控件都是很常用的,不需要每次使用的时候都重新写一个,这样比较麻烦,也浪费时间。本人自定义了一些控件。

废话不多说,接下来就直奔主题,开始撸代码吧。

package com.morse.library.views;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.text.Editable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;import com.morse.library.R;
import com.morse.library.utils.CountDown;/*** 带倒计时控件的+label+edittext的组合控件** @company:大后天* @Author:曾明* @Time:2017/8/21 19:14* @Description:*/
public class MLabelEditText extends LinearLayout implements View.OnClickListener {private TextView tvLabel;private EditText etEdit;private TextView tvCounter;private CountDown mCountDown;private long mTime;private long mInterval;private IRightClickListener mListener;public void setRightClickListener(IRightClickListener listener) {mListener = listener;}public MLabelEditText(Context context) {this(context, null);}public MLabelEditText(Context context, AttributeSet attrs) {super(context, attrs);initView(context, attrs);}public MLabelEditText(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView(context, attrs);}private void initView(Context context, AttributeSet attrs) {
//        setGravity(Gravity.CENTER_VERTICAL);
//        setOrientation(HORIZONTAL);
//        setWillNotDraw(false);View view = LayoutInflater.from(context).inflate(R.layout.include_label_editview, this);
//        view.setBackgroundResource(R.drawable.shape_input_bg);tvLabel = (TextView) view.findViewById(R.id.lev_label);etEdit = (EditText) view.findViewById(R.id.lev_edit);tvCounter = (TextView) view.findViewById(R.id.lev_count);TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MLabelEditView);String label = ta.getString(R.styleable.MLabelEditView_m_lev_label);String hint = ta.getString(R.styleable.MLabelEditView_m_lev_edit_hint);String edit = ta.getString(R.styleable.MLabelEditView_m_lev_edit);String counter = ta.getString(R.styleable.MLabelEditView_m_lev_count);int vCount = ta.getInt(R.styleable.MLabelEditView_m_lev_count_visibilty, 0);int vLabel = ta.getInt(R.styleable.MLabelEditView_m_lev_label_visibilty, 0);int color = ta.getInt(R.styleable.MLabelEditView_m_lev_count_color, Color.WHITE);int ems = ta.getInt(R.styleable.MLabelEditView_m_lev_ems, 5);ta.recycle();setLabel(label);setEditHint(hint);setEditText(edit);setCountText(counter);setCountVisibility(tvLabel, vLabel);setCountVisibility(tvCounter, vCount);setCountColor(color);setMinEms(ems);tvCounter.setOnClickListener(this);}/*** 设置右边控件的背景颜色** @param color*/public void setCountColor(int color) {if (color != -1) {tvCounter.setBackgroundResource(color);}}public void setTvCounterEnable(boolean isEnable){tvCounter.setEnabled(isEnable);}/*** 设置左边控件文本** @param label*/public void setLabel(String label) {if (!TextUtils.isEmpty(label)) {tvLabel.setText(label);}}/*** 设置EditText hint** @param hint*/public void setEditHint(String hint) {if (!TextUtils.isEmpty(hint)) {etEdit.setHint(hint);}}/*** 设置EditText 文本** @param edit*/public void setEditText(String edit) {if (!TextUtils.isEmpty(edit)) {etEdit.setText(edit);etEdit.setSelection(edit.length());}}/*** 设置右边控件文本** @param counter*/public void setCountText(String counter) {if (!TextUtils.isEmpty(counter)) {tvCounter.setText(counter);}}/*** 设置输入文本类型** @param type*/public void setInputType(int type) {etEdit.setInputType(type);}/*** 设置倒计时时长** @param time*/public void setTime(long time) {if (time > 0) {mTime = time;}}/*** 设置倒计时时间间隔** @param interval*/public void setInterval(long interval) {if (interval > 0) {mInterval = interval;}}/*** 设置右边控件的显示与隐藏* <p>0:显示</p>* <p>1:隐藏</p>* <p>2:隐藏,但控件还是占有空间</p>** @param v*/public void setCountVisibility(View view, int v) {if (v > 0) {switch (v) {case 0:view.setVisibility(VISIBLE);break;case 1:view.setVisibility(GONE);break;case 2:view.setVisibility(INVISIBLE);break;default:view.setVisibility(VISIBLE);break;}}}/*** 获取EditText文本** @return*/public String getText() {Editable editable = etEdit.getText();if (null == editable || TextUtils.isEmpty(editable.toString())) {return "";}return editable.toString();}public void setTextType() {}@Overridepublic void onClick(View v) {int id = v.getId();if (id == R.id.lev_count) {if (null != mListener) {mListener.onRightClick();}if (null == mCountDown) {mCountDown = new CountDown(getContext(), mTime, mInterval, tvCounter, 0, 0, 0);}mCountDown.start();}}public void setMinEms(int minEms) {if (minEms > 0) {tvLabel.setMinEms(minEms);}}/*** 右边控件点击事件*/public interface IRightClickListener {void onRightClick();}
}

属性:

<declare-styleable name="MLabelEditView"><attr name="m_lev_label" format="string" /><attr name="m_lev_edit_hint" format="string" /><attr name="m_lev_count" format="string" /><attr name="m_lev_edit" format="string" /><attr name="m_lev_count_visibilty"><enum name="visiable" value="0" /><enum name="gone" value="1" /><enum name="invisiable" value="2" /></attr><attr name="m_lev_label_visibilty"><enum name="visiable" value="0" /><enum name="gone" value="1" /><enum name="invisiable" value="2" /></attr><attr name="m_lev_count_color" format="reference" /><attr name="m_lev_ems" format="integer" /></declare-styleable>

当然还需要倒计时:

package com.morse.library.utils;import android.content.Context;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;/*** 倒计时工具类** @company:大后天* @Author:曾明* @Time:2017/8/23 21:06* @Description:*/
public class CountDown extends CountDownTimer {private Context mContext;private View mView;private int mColor;private int mText;private int mFinishText;/*** 倒计时** @param context* @param millisInFuture    倒计时时长* @param countDownInterval 倒计时时间间隔* @param view              倒计时控件* @param color             控件颜色* @param text              倒计时开始之后显示的文本* @param finishText        倒计时结束之后显示的文本*/public CountDown(Context context, long millisInFuture, long countDownInterval, View view, int color, int text, int finishText) {super(millisInFuture, countDownInterval);mContext = context;mView = view;mColor = color;mText = text;mFinishText = finishText;}public CountDown(Context context, long millisInFuture, long countDownInterval, View view, int text, int finishText) {this(context, millisInFuture, countDownInterval, view, -1, text, finishText);}@Overridepublic void onTick(long millisUntilFinished) {if (mView instanceof TextView || mView instanceof Button) {mView.setClickable(false);if (mColor > 0) {mView.setBackgroundColor(mContext.getResources().getColor(mColor));}if (mText <= 0) {return;}mView.setTag(mContext.getResources().getString(mText, millisUntilFinished / 1000));}}@Overridepublic void onFinish() {if (mView instanceof TextView || mView instanceof Button) {mView.setClickable(true);if (mColor > 0) {mView.setBackgroundColor(mContext.getResources().getColor(mColor));}if (mFinishText <= 0) {return;}mView.setTag(mContext.getResources().getString(mFinishText));}}
}

注释已经很详细,具体的我就不再啰嗦了。希望对各位有所帮助。

Android自定义控件——获取验证码倒计时相关推荐

  1. Android实现获取验证码的倒计时功能

    开发中经常会遇到获取短信验证码,获取验证码后需要等待1分钟倒计时,这段时间是不能再次发送短信请求的. 实现如下: CountDownTimerUtils.java package com.zhw.my ...

  2. android 获取验证码倒计时

    在开发时,登陆注册时必有的模块,下面是记录一下注册时获取验证码的方法:效果图如下: 获取验证码后,进入倒计时并且是不可点击的状态. 1.复制下面工具类到项目中 import android.graph ...

  3. vue 获取验证码倒计时组件

    之前写过一个计时函数,有计算误差,但是验证码的60秒倒计时可以忽略这一点点误差.直接上代码. <template><div class="captcha-row" ...

  4. Axure9 实现点击获取验证码倒计时功能

    此文章帮助大家实现App的点击获取验证码的倒计时功能. 1:创建按钮和全局变量: 拖入一个矩形,创建全局变量Time=60. 在项目里面就可以找到创建全局变量的地方. 2:添加点击事件: (1):添加 ...

  5. VUE定时器,用于登陆获取验证码倒计时

    第一步 在当前的按钮中添加@click 事件,并在按钮内文字后面加上变量,并用v-if进行判断,看秒数是否大于0 并且添加disabled,当second>0的时候给它disabled掉. 第二 ...

  6. jQuery 点击获取验证码,倒计时30秒

    //HTML: <div class="layui-form-item">     <input class="layui-yanzheng" ...

  7. js 获取验证码倒计时

    1 html 部分 <text :disabled="disabled" @click="getCode">{{ btntext }}</te ...

  8. Flutter获取验证码倒计时按钮

    在Flutter中,有一个定时器类Timer,使用方法: Timer timer = new Timer(new Duration(milliseconds: 60), (){//倒计时结束执行}); ...

  9. 微信小程序获取验证码倒计时

    实现效果图 使用方法: setInterval demo:(如果对 setInterval不了解的可以先百度下) xml 中写一个按钮: <view class="container& ...

最新文章

  1. CashTippr:比特币现金MoneyButton打赏插件
  2. spring mvc logback
  3. SAP BAPI的一些初级资料
  4. 数学之美 系列九 -- 如何确定网页和查询的相关性
  5. emq+mysql设置_EMQ--添加mysql认证及mysql插件访问控制
  6. unittest里discover用法_unittest框架核心要素及应用
  7. 糖果浏览器和139邮箱巧妙应用:将网页文字一键发送到手机上
  8. 页面滚动事件无效小记
  9. 易语言窗口c_句柄取进程名,易语言窗口句柄取进程文件名源码
  10. 页面搭建工具总结及扩展架构思考
  11. 总结过去10年的程序员生涯
  12. Matlab使用for循环实现5阶乘和的计算
  13. 互联网公司的裁员,能玩出多少种花样?
  14. 微信小程序聊天功能 WebSocket 实现发送文字,图片,语音以及WebSocket 常见问题解决方案
  15. 红米9A成功root.9秒解锁BL MIUI12 root权限刷 Magisk面具 TWRP
  16. 微信小程序开发案例2---省市区信息选择
  17. 人工智能专家系统c语言,人工智能实验4三-专家系统.doc
  18. 一文读懂新华三引领Wi-Fi 6市场的秘密
  19. 做一件事如何突破「擅长」达到「精通」
  20. Spring整合Quartz集群部署

热门文章

  1. 如何在iPhone或iPad上查找您的位置记录
  2. 「AI 孙燕姿」翻唱华语乐坛歌曲爆红全网,AI 翻唱将带来哪些影响?是否会有版权等问题?
  3. 元旦:CS的陋室2021年热门文章小结——NLP技术、学习与成长
  4. 你第一篇SCI写了几个月?
  5. 小程序基础、云服务介绍
  6. 你的网还好么?百兆宽带你真享受到了?
  7. 【硬件】嵌入式板卡硬件电路设计、焊接
  8. 修改CentOS8默认远程端口
  9. 使用高校或科研机构的 edu 邮箱注册 Office 365 教育版
  10. python实现按键精灵的功能_pyautogui简介_python中的按键精灵_键盘鼠标模拟