上篇博客讲到登录注册的流程所需用到的带显示密码的输入框,而在整个完整流程中,短信发送获取验证码并填写相信也是重要的一环。当然,关于验证码的实现很多大神的博客也写过,并且款式多样,任君选择,这里只是记录一下小弟在开发过程中用到的验证码输入框。

先上图:

要实现的就是中间的那个验证码输入框。

这里我们需要实现的点有:1)EditText的排版布局; 2)EditText的背景框; 3)在自定义View编写时需要对第一个输入框进行焦点获取; 4)当输入完一个框后需要自动对焦下一个输入框

  1.EditText的排版布局

和之前一样,我们先在布局文件中定义好这四个输入框,然后通过建立自定义View继承自ViewGroup或其子类并传入此布局作为我们的操作的View。

注意:这里由于每个验证码框仅能输入一位,所以我们在布局里对每一个EditText控件都要有最大长度的属性要求。

                         

2.EditText的背景框

相信大家对drawable目录下的各种drawable文件都玩的得心应手了,小弟想着代码量不多,并没有对焦点是否对焦的状态分开来写,而是直接写在了selector下,以减少操作量。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_focused="true"><layer-list><item><shape><solid android:color="#c6defdff" /><corners android:radius="30dp" /></shape></item><item android:left="5dp" android:top="5dp"android:bottom="5dp" android:right="5dp"><shape><solid android:color="@android:color/white" /><corners android:radius="12dp" /><stroke android:color="@color/colorAccent"android:width="1dp" /></shape></item></layer-list></item><item android:state_focused="false"><layer-list><item><shape><solid android:color="#26ededed" /><corners android:radius="30dp" /></shape></item><item android:left="5dp" android:top="5dp"android:right="5dp" android:bottom="5dp"><shape><solid android:color="@android:color/white" /><corners android:radius="12dp" /><stroke android:color="#43cccccc"android:width="1dp" /></shape></item></layer-list></item>
</selector>

这里我用layer-list作了一个小阴影效果,以看起来有小小的层次感。然后对边界作了圆弧化。

3.View的编写

这里我们需要将第一个EditText自动获取其焦点。即:

first.setFocusable(true);
first.setFocusableInTouchMode(true);

如果需要软键盘自动弹出,我们可以定义一个InputMethodManager来控制软键盘的弹出与收起,不过在某些机型上貌似有点问题,所以可以在manifest文件中对应的activity标签下添加属性:

android:windowSoftInputMode="stateVisible|adjustResize"

然后我们就要对输入过的文本框进行焦点清除,并获取下一个EditText的焦点。

private void focus() {EditText editText;//利用for循环找出前面还没被输入字符的EditTextfor (int i = 0; i < mEdits.size(); i++) {editText = mEdits.get(i);if (editText.getText().length() < 1) {editText.requestFocus();return;} else {editText.setCursorVisible(false);}}EditText lastEditText = mEdits.get(mEdits.size() - 1);if (lastEditText.getText().length() > 0) {//收起软键盘 并不允许编辑 同时将输入的文本提交getResponse();lastEditText.setCursorVisible(false);InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);}
}

这里通过循环去找到前面还没有被输入过的文本框,若存在,则对其进行焦点获取(将此方法用于TextWatcher中监听每个输入框的输入事件,则可以实现自动获取下一个EditText的焦点);否则进行文本提交。

完整代码:

package com.example.carson.myapplicationtesting;import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.RelativeLayout;import java.util.ArrayList;import com.example.carson.myapplicationtesting.R;import java.util.ArrayList;
import java.util.List;/*** Created by 84594 on 2018/7/30.*/public class CodeView extends RelativeLayout implements View.OnFocusChangeListener {//设验证码有4位private EditText first, second, third, fourth;private OnInputFinishListener mInputListener;private List<EditText> mEdits = new ArrayList<EditText>();public CodeView(Context context) {this(context, null);}public CodeView(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public CodeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView();}private void initView() {LayoutInflater.from(getContext()).inflate(R.layout.layout_code, this, true);first = findViewById(R.id.edit_first);second = findViewById(R.id.edit_second);third = findViewById(R.id.edit_third);fourth = findViewById(R.id.edit_fourth);mEdits.add(first);mEdits.add(second);mEdits.add(third);mEdits.add(fourth);first.setFocusable(true);first.addTextChangedListener(new MyTextWatcher());second.addTextChangedListener(new MyTextWatcher());third.addTextChangedListener(new MyTextWatcher());fourth.addTextChangedListener(new MyTextWatcher());first.setOnFocusChangeListener(this);second.setOnFocusChangeListener(this);third.setOnFocusChangeListener(this);fourth.setOnFocusChangeListener(this);}@Overridepublic void setEnabled(boolean enabled) {int childCount = getChildCount();for (int i = 0; i < childCount; i ++) {View child = getChildAt(i);child.setEnabled(enabled);}}@Overridepublic void onFocusChange(View view, boolean focus) {if (focus) {focus();}}public void setmInputListener(OnInputFinishListener mInputListener) {this.mInputListener = mInputListener;}private class MyTextWatcher implements TextWatcher {@Overridepublic void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}@Overridepublic void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}@Overridepublic void afterTextChanged(Editable editable) {if (editable.length() != 0) {focus();}}}private void focus() {EditText editText;//利用for循环找出前面还没被输入字符的EditTextfor (int i = 0; i < mEdits.size(); i++) {editText = mEdits.get(i);if (editText.getText().length() < 1) {editText.requestFocus();return;} else {editText.setCursorVisible(false);}}EditText lastEditText = mEdits.get(mEdits.size() - 1);if (lastEditText.getText().length() > 0) {//收起软键盘 并不允许编辑 同时将输入的文本提交getResponse();lastEditText.setCursorVisible(false);InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);}}public void getResponse() {Log.e("CodeView", "ok");StringBuilder sb = new StringBuilder();for (int i = 0; i < mEdits.size(); i++) {sb.append(mEdits.get(i).getText().toString());}if (mInputListener != null) {mInputListener.onFinish(sb.toString());}}//对外封装一个重置或直接填写验证码的方法public void setText(String text) {if (text.length() == mEdits.size()) {StringBuilder sb = new StringBuilder(text);first.setText(sb.substring(0, 1));second.setText(sb.substring(1, 2));third.setText(sb.substring(2, 3));fourth.setText(sb.substring(3, 4));} else {first.setText("");second.setText("");third.setText("");fourth.setText("");
//            first.setCursorVisible(true);first.requestFocus();}}//一个监听输入结束的接口,以便外部回调结束后执行的方法public interface OnInputFinishListener {void onFinish(String code);}
}

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="100dp"android:gravity="center"><EditTextandroid:id="@+id/edit_first"android:layout_width="0dp"android:layout_height="70dp"android:layout_weight="1"android:inputType="number"android:textSize="40sp"android:maxLength="1"android:textCursorDrawable="@null"android:textColor="@color/colorAccent"android:textAlignment="center"android:background="@drawable/selector_code_edit"android:layout_margin="5dp"/><EditTextandroid:id="@+id/edit_second"android:layout_width="0dp"android:layout_height="70dp"android:layout_weight="1"android:inputType="number"android:textSize="40sp"android:maxLength="1"android:textColor="@color/colorAccent"android:textCursorDrawable="@null"android:textAlignment="center"android:background="@drawable/selector_code_edit"android:layout_margin="5dp"/><EditTextandroid:id="@+id/edit_third"android:layout_width="0dp"android:layout_height="70dp"android:layout_weight="1"android:inputType="number"android:textSize="40sp"android:maxLength="1"android:textColor="@color/colorAccent"android:textCursorDrawable="@null"android:textAlignment="center"android:background="@drawable/selector_code_edit"android:layout_margin="5dp"/><EditTextandroid:id="@+id/edit_fourth"android:layout_width="0dp"android:layout_height="70dp"android:layout_weight="1"android:inputType="number"android:textSize="40sp"android:maxLength="1"android:textColor="@color/colorAccent"android:textCursorDrawable="@null"android:textAlignment="center"android:background="@drawable/selector_code_edit"android:layout_margin="5dp"/></LinearLayout></RelativeLayout>

Android 验证码输入框的实现相关推荐

  1. Android验证码输入框支持粘贴

    验证码输入框,满足剪切板内容自动填充,看效果 原本做法是6个EditText,后来发现,这样写最大问题是,无法满足粘贴功能,验证码短信 一般都带"复制",点击 短信通知栏 的&qu ...

  2. Android View篇之自定义验证码输入框

    首先,我们来看看实现的是怎么样的效果: 如果我们拿到这样的UI,想到的布局应该是用4个EditText包在横向的LinearLayout里面,但今天要讲的View,所以我们决定用一个自定义的EditT ...

  3. Android自定义View实现滴滴验证码输入框效果

    先上效果图让大家看看 1.VerficationCodeInput.Java /** * 輸入验证码的自定义view * */ public class VerificationCodeInput e ...

  4. Android中的验证码输入框

    验证码.激活码各种码的输入框格日常使用里屡见不鲜了,四格的,六格的 最近开发遇到这么一个输入14位序号(美观而需要输入框)的需求,本着这种简单控件,不重复造轮子的想法,开始全网搜寻ing- 但就是这么 ...

  5. 【Android】短信验证码输入框(80/100)

    先看效果动图如下: 验证码输入框是常用的app功能页面,实现上并不复杂详情如下: 首先是布局xml文件如下: <?xml version="1.0" encoding=&qu ...

  6. Android 短信验证码输入框

    日常开发中,我们会遇到一些很炫酷的手机短信验证码输入,但系统自带的EditText显然并不能满足所需的短信验证码输入框,因此,在系统自带的EditText基础上自定义短信验证码输入框. 实现思路是:定 ...

  7. android 自定义本地验证码demo,Android 自定义验证码输入框的实例代码(支持粘贴连续性)...

    需求 1.能自定义输入框个数和样式 2.支持长按粘贴或剪切板内容自动填充(粘贴连续性) 其中第2点是最为重要的,正是其他人没有这点,逼得自己弄一个 示例 别人的示例: 粘贴居然不支持连续性,只能粘贴第 ...

  8. Android 验证码和密码输入框,能自定义输入框个数和样式(连体,下划线和方形框) 类似微信支付宝的密码输入框等

    MNPasswordEditText 项目地址:maning0303/MNPasswordEditText  简介: Android 验证码和密码输入框,能自定义输入框个数和样式(连体,下划线和方形框 ...

  9. android 验证码之短信验证(云之讯短信平台)

    好久没更新过博客了.这段时间总算是忙完了,抽点时间出来更新下博客.这次跟大家带来的是一个很简单的短信验证码.相信这个验证码的功能基本上99的项目都需要用到,我这里是用的云之迅平台,为什么要用这个平台, ...

最新文章

  1. 洛谷 P1678 烦恼的高考志愿
  2. 物联网正占据有利风口 2017年实现商用不难
  3. 通过图书编号查询python_文字版图书管理-python练习
  4. NodeJS同步MySQL上游数据到ElasticSearch数据库中
  5. 【OpenCV】图像线性混合
  6. Hadoop完全分布式安装Kafka
  7. linux shell脚本 检查IP地址格式
  8. 学习python的错误总结
  9. PDO 学习与使用 ( 二 ) PDO 数据提取 和 预处理语句
  10. 02 凸优化理论-凸集
  11. 启善企业微信自动加好友助手教程
  12. 服务器虚拟化专用ovf模板,开放虚拟化格式(OVF)
  13. 利用阿里云ECS制作个人简历网站
  14. 推荐10部最有影响力的韩剧,如未上榜的请留言下期推荐
  15. 【5G RRC】Master Information Block (NR-MIB)
  16. 9.条件语句(if语句)
  17. O2OA开源免费开发平台搭建教程:系统配置中,主要配置文件的说明详情
  18. i5 1035g1和r5 3500u哪个好
  19. 【Week 11 作业】必做题
  20. html中使用JS实现图片轮播效果

热门文章

  1. Caliburn.Micro 杰的入门教程3,事件和参数
  2. 【其他】【RQNOJ】同分异构体
  3. java代码优化的方法和准则_编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议16~20)...
  4. 文件处理命令(二)目录处理命令
  5. JAVA面试常见问题200+
  6. 编译器和解释器,预编译和预处理
  7. Don Box博客中文版入驻CSDN,志愿者翻译招募中....
  8. 实时即未来,大数据项目车联网之原始数据实时ETL任务HBase调优【九】
  9. 4/20 Fizz Buzz(412)
  10. 灰色关联分析(系统分析+综合评价)