效果图


GIF图不是很清晰,下面是截图

思路

1 . 每一个输入框其实都是一个EditTextfor循环创建并插入到LinearLayout中。

private void initView() {        for (int i = 0; i < mEtNumber; i++) {            EditText editText = new EditText(mContext);            initEditText(editText, i); //editText初始化            addView(editText);            if (i == 0) { //设置第一个editText获取焦点                editText.setFocusable(true);            }        }    }

2 . 给每个editText设置TextWatcher监听,检测到被输入一个字符后,就把焦点移交给下一个editText

@Override    public void afterTextChanged(Editable s) {        if (s.length() != 0) {            focus();        }    }
private void focus() {        int count = getChildCount();        EditText editText;        //利用for循环找出还最前面那个还没被输入字符的EditText,并把焦点移交给它。        for (int i = 0; i < count; i++) {            editText = (EditText) getChildAt(i);            if (editText.getText().length() < 1) {                editText.setCursorVisible(true);                editText.requestFocus();                return;            } else {                editText.setCursorVisible(false);            }        }        //如果最后一个输入框有字符,则返回结果        EditText lastEditText = (EditText) getChildAt(mEtNumber - 1);        if (lastEditText.getText().length() > 0) {            getResult();        }    }

3 . 同理,给每一个editText设置View.OnKeyListener监听,用于检测删除键。

@Override    public boolean onKey(View v, int keyCode, KeyEvent event) {        if (keyCode == KeyEvent.KEYCODE_DEL) {            backFocus();        }        return false;    }
private void backFocus() {        //博主手机不好,经常点一次却触发两次`onKey`事件,就设置了一个防止多点击,间隔100毫秒。        long startTime = System.currentTimeMillis();        EditText editText;        //循环检测有字符的`editText`,把其置空,并获取焦点。        for (int i = mEtNumber - 1; i >= 0; i--) {            editText = (EditText) getChildAt(i);            if (editText.getText().length() >= 1 && startTime - endTime > 100) {                editText.setText("");                editText.setCursorVisible(true);                editText.requestFocus();                endTime = startTime;                return;            }        }    }

4 .要让editText依次获取焦点,防止出现第一个editText还没输入就能输入第二个editText的情况。
同理,需要View.OnFocusChangeListener监听。

//获取焦点后随即`focus()`方法,进行焦点移交。@Override    public void onFocusChange(View v, boolean hasFocus) {        if (hasFocus) {            focus();         }    }

源码及用法详见GitHub。

Android开发 自定义方形验证码输入框


如果对您有帮助的话,还请给个收藏或者star,谢谢!


更多相关文章

  1. ScrollView内部嵌套Recyclerview,防止recyclerview自动获得焦点
  2. Android之控件保持在软键盘上面
  3. fragment editText 焦点问题
  4. WebView滑动监听
  5. 【android】使用Event Bus模式解耦Android(安卓)App组件间通信
  6. Android播放音频之按钮控制
  7. Android(安卓)判定网络连接状态 以及监听网络链接状态的变化
  8. Android(安卓)的网络判定(网络连接类型和监听网络连接变化)
  9. Android中关于APK对遥控器支持的修改

随机推荐

  1. 基于SearchView实时搜索结果
  2. 记录下android studio 重命名包名
  3. cordova学习二:图标与启动屏幕设置
  4. Android(安卓)O 绑定SurfaceFlinger到大
  5. 使用Eclipse运行项目的时候报Conversion
  6. Android(安卓)平板开发关闭一个Fragment
  7. Android(安卓)Intent.FLAG_ACTIVITY_NEW_
  8. [Android]Android权限列表
  9. android Java 提交数据到服务器的两种方
  10. Android(安卓)游戏开发必备的基础知识