Android自定义控件——获取验证码倒计时
来源:互联网 发布:安装软件赚钱联盟 编辑:程序博客网 时间:2024/05/16 08:25
目前为止,有很多地方都需要绑定用户手机号,发送短信,比如说找回密码,注册或者登陆,这些控件都是很常用的,不需要每次使用的时候都重新写一个,这样比较麻烦,也浪费时间。本人自定义了一些控件。
废话不多说,接下来就直奔主题,开始撸代码吧。
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() { } @Override public 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); } @Override public 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)); } } @Override public 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)); } }}
注释已经很详细,具体的我就不再啰嗦了。希望对各位有所帮助。
阅读全文
1 0
- Android自定义控件——获取验证码倒计时
- Android自定义控件系列(七)—验证码倒计时
- 【Android自定义View实战】之获取验证码倒计时按钮
- Android 验证码倒计时控件
- Android获取验证码倒计时
- Android 获取验证码倒计时
- Android获取验证码倒计时
- android 获取验证码倒计时
- 自定义短信验证码中的倒计时控件
- 自定义验证码发送倒计时控件
- Android自定义倒计时控件
- Android自定义倒计时控件
- Android自定义倒计时控件
- Android自定义控件 倒计时
- Android手机验证码倒计时控件
- android自定义验证码倒计时View
- Android发送验证码倒计时自定义View
- Android 自定义发送验证码, 倒计时
- Android进阶一:Fragment之间的数据通信
- 使用jQuery清空file文件域的方法
- 事物的特性,隔离级别、传播行为
- 跨考生技术之路
- Javascript函数形参与实参
- Android自定义控件——获取验证码倒计时
- date() strtotime() -1day 运用解题
- python-k均值聚类
- Maven(一)初识Maven
- Codeforces-429-2-C Leha and Function
- 线性代数(一):奇异值分解
- 十分钟学会使用贝塞尔弧线
- JSTL、EL、ONGL、Struts标签的区别与使用
- 读取properties文件工具类