I don't want to survive I want to live --- 鸡汤走起
做了这么多的项目 越来越反感重复的代码重复写了 有人说可以ctrl+c 和ctrl 但是有的代码很多 ,直接复制过来还得去整理,很烦. 所以决定要改掉这个习惯,尽量按照功能去把功能抽出来.今天就简单做了一个.虽然简陋,但是是开始 。分享一下.
每个项目都有获取验证码这个功能,而且这个逻辑一样,只是样式不一样罢了,由于以前都是在注册或者忘记密码出来,所以就抽出来一个父类。
代码如下
private static long millisInFuture = 60000; private static long countDownInterval = 1000; private TimeCount time; @BindView(R.id.edAccount) protected EditText edAccount; @BindView(R.id.btnGetCode) protected TextView tvGetCode; @BindView(R.id.edCode) protected EditText edCode; protected String account; protected String code; @OnClick(R.id.btnGetCode) public void onClick(View view) { getCode(); } /* * 得到验证码 */ private void getCode() { if (isMobileNoCorrect(edAccount)) { toSubscribe(HttpUtils.getApi().getCode(account), new ProgressSubscriber<String>(this) { @Override public void onNext(String httpResult) { } }); } } class TimeCount extends CountDownTimer { TextView tvGetCode; public TimeCount(long millisInFuture, long countDownInterval) { super(millisInFuture, countDownInterval); } public TimeCount(long millisInFuture, long countDownInterval, TextView tvGetCode) { super(millisInFuture, countDownInterval); this.tvGetCode = tvGetCode; } @Override public void onFinish() {// 计时完毕 tvGetCode.setText("获取验证码"); tvGetCode.setClickable(true); } @Override public void onTick(long millisUntilFinished) {// 计时过程 tvGetCode.setClickable(false);// 防止重复点击 tvGetCode.setText("剩余" + millisUntilFinished / 1000 + "秒"); } }用的也挺happy 可是项目突然在一个fragment里面出现了一个要获取验证码 顿时崩溃了. fragment 不能继承activity.
思前想后 这能自定义一个textView 这样就灵活多了.
private static final String INITTEXT = "获取验证码"; private static final String FINISHTEXT = "重新获取"; private long millisInFuture;// 结束的时间 private int countDownInterval = 1000;//倒计时间隔 默认一秒 private CountDownTimer timeCount; private boolean isRuning; // 是否正在运行 private String mStartText;// 开始时文本 private String mFinishText;// 完成倒计时后的文本显示 private final int CODE = 1;//验证码 private final int TIME = 2;// 时间 private int type; public CountDownTextView(Context context) { this(context, null); } public CountDownTextView(Context context, AttributeSet attrs) { super(context, attrs); initData(); } public void setCountDownInterval(int countDownInterval) { this.countDownInterval = countDownInterval; } public boolean isRuning() { return isRuning; } public void setRuning(boolean runing) { isRuning = runing; } public void setmFinishText(String mFinishText) { this.mFinishText = mFinishText; } public void setMillisInFuture(long millisInFuture) { this.millisInFuture = millisInFuture; } public void setmStartText(String mStartText) { this.mStartText = mStartText; } public void setTimeCount(CountDownTimer timeCount) { this.timeCount = timeCount; } public void setType(int type) { this.type = type; } /** * 初始化数据 */ public void initData() { mStartText = INITTEXT; setText(mStartText); mFinishText = FINISHTEXT; millisInFuture = 60000; type = TIME; } /** * 开始倒计时 */ public void startCountDown() { setClickable(false); setText(mStartText); isRuning = true; if (timeCount == null) { timeCount = new TimeCount(); } timeCount.start(); } /** * 结束倒计时 */ public void endCountDown() { setText(mFinishText); setClickable(true); isRuning = false; } /** * 停止 */ public void stopCountDown() { endCountDown(); if (timeCount != null) { timeCount.cancel(); } } // 点击事件 @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { if (isRuning) { return false; } else { startCountDown(); } } return super.onTouchEvent(event); } /** * 时间倒计时 */ class TimeCount extends CountDownTimer { public TimeCount() { super(millisInFuture, countDownInterval); } @Override public void onFinish() {// 计时完毕 endCountDown(); } @Override public void onTick(long millisUntilFinished) {// 计时过程 if (type == TIME) { setText(DateUtils.getFormatDate(DateUtils.COMMON_TIME, millisUntilFinished)); } else if (type == CODE) { StringBuilder builder = new StringBuilder(); builder.append("剩余").append(millisUntilFinished / 1000).append("秒"); setText(builder.toString()); } } }
只需要 调用startCountDown 就可以实现 倒计时功能 现在还没又发现什么问题 一起以后会继续更新一个这个控件..