EditText方框验证码

EditText方框验证码

144
作者 xiawe_i
2016.11.07 22:14* 字数 49 阅读 371 评论 1

项目中有这样一个需求:

  验证码页是四个方框,输入验证码方框颜色改变,删除再变回原来颜色。

先看下效果,动图不太清晰,将就看吧



效果.gif


思路:

 1.用一个透明的EditText与四个TextView重叠,并给TextView设置默认背景
 2.监听EditText文本变化,获取输入内容,给TextView赋值并改变TextView背景
 3. 4个TextView有值后添加输入完成回调,监听删除键添加删除回调

代码:

private EditText editText;
private TextView[] TextViews;
private StringBuffer stringBuffer = new StringBuffer();
private int count = 4;
private String inputContent;

public SecurityCodeView(Context context) {
    this(context, null);
}

public SecurityCodeView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public SecurityCodeView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    TextViews = new TextView[4];
    View.inflate(context, R.layout.view_security_code, this);

    editText = (EditText) findViewById(R.id.item_edittext);
    TextViews[0] = (TextView) findViewById(R.id.item_code_iv1);
    TextViews[1] = (TextView) findViewById(R.id.item_code_iv2);
    TextViews[2] = (TextView) findViewById(R.id.item_code_iv3);
    TextViews[3] = (TextView) findViewById(R.id.item_code_iv4);

    editText.setCursorVisible(false);//将光标隐藏
    setListener();
}

private void setListener() {
    editText.addTextChangedListener(new TextWatcher() {

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
            //重点   如果字符不为""时才进行操作
            if (!editable.toString().equals("")) {
                if (stringBuffer.length() > 3) {
                    //当文本长度大于3位时edittext置空
                    editText.setText("");
                    return;
                } else {
                    //将文字添加到StringBuffer中
                    stringBuffer.append(editable);
                    editText.setText("");//添加后将EditText置空  
                    //  Log.e("TAG", "afterTextChanged: stringBuffer is " + stringBuffer);
                    count = stringBuffer.length();//记录stringbuffer的长度
                    inputContent = stringBuffer.toString();
                    if (stringBuffer.length() == 4) {
                        //文字长度位4  则调用完成输入的监听
                        if (inputCompleteListener != null) {
                            inputCompleteListener.inputComplete();
                        }
                    }
                }

                for (int i = 0; i < stringBuffer.length(); i++) {
                    TextViews[i].setText(String.valueOf(inputContent.charAt(i)));
                    TextViews[i].setBackgroundResource(R.mipmap.bg_verify_press);
                }

            }
        }
    });

    editText.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_DEL
                    && event.getAction() == KeyEvent.ACTION_DOWN) {
                if (onKeyDelete()) return true;
                return true;
            }
            return false;
        }
    });
}


public boolean onKeyDelete() {
    if (count == 0) {
        count = 4;
        return true;
    }
    if (stringBuffer.length() > 0) {
        //删除相应位置的字符
        stringBuffer.delete((count - 1), count);
        count--;
        //   Log.e(TAG, "afterTextChanged: stringBuffer is " + stringBuffer);
        inputContent = stringBuffer.toString();
        TextViews[stringBuffer.length()].setText("");
        TextViews[stringBuffer.length()].setBackgroundResource(R.mipmap.bg_verify);
        if (inputCompleteListener != null)
            inputCompleteListener.deleteContent(true);//有删除就通知manger

    }
    return false;
}

/**
 * 清空输入内容
 */
public void clearEditText() {
    stringBuffer.delete(0, stringBuffer.length());
    inputContent = stringBuffer.toString();
    for (int i = 0; i < TextViews.length; i++) {
        TextViews[i].setText("");
        TextViews[i].setBackgroundResource(R.mipmap.bg_verify);
    }
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    return super.onKeyDown(keyCode, event);
}

private InputCompleteListener inputCompleteListener;

public void setInputCompleteListener(InputCompleteListener inputCompleteListener) {
    this.inputCompleteListener = inputCompleteListener;
}

public interface InputCompleteListener {
    void inputComplete();

    void deleteContent(boolean isDelete);
}

/**
 * 获取输入文本
 *
 * @return
 */
public String getEditContent() {
    return inputContent;
}

布局

  <?xml version="1.0" encoding="utf-8"?>
  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content">

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="47dp"
    android:gravity="center"
    android:orientation="horizontal"
    android:weightSum="3">


    <TextView
        android:id="@+id/item_code_iv1"
        style="@style/text_editStyle" />

    <View
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/item_code_iv2"
        style="@style/text_editStyle" />

    <View
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/item_code_iv3"
        style="@style/text_editStyle" />

    <View
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/item_code_iv4"
        style="@style/text_editStyle" />


</LinearLayout>

<EditText
    android:id="@+id/item_edittext"
    android:layout_width="match_parent"
    android:layout_height="46dp"
    android:background="@android:color/transparent"
    android:inputType="number" />

</RelativeLayout>

使用:

    <com.xiaviv.securitycodedemo.SecurityCodeView
    android:id="@+id/scv_edittext"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginTop="20dp" />


<TextView
    android:id="@+id/tv_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginTop="10dp"
    android:layout_weight="4"
    android:text="输入验证码表示同意《用户协议》" />

   public class MainActivity extends AppCompatActivity implements SecurityCodeView.InputCompleteListener {

    private SecurityCodeView editText;
    private TextView text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    findViews();
    setListener();
  }

    private void setListener() {
    editText.setInputCompleteListener(this);
  }

    private void findViews() {
    editText = (SecurityCodeView) findViewById(R.id.scv_edittext);
    text = (TextView) findViewById(R.id.tv_text);
  }

    @Override
    public void inputComplete() {
        Toast.makeText(getApplicationContext(), "验证码是:" + editText.getEditContent(), Toast.LENGTH_LONG).show();
        if (!editText.getEditContent().equals("1234")) {
        text.setText("验证码输入错误");
        text.setTextColor(Color.RED);
      }
  }

    @Override
    public void deleteContent(boolean isDelete) {
        if (isDelete){
        text.setText("输入验证码表示同意《用户协议》");
        text.setTextColor(Color.BLACK);
      }
  }
}

Demo地址:https://github.com/xiaviv/SecurityCodeDemo

Android
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你好,欢迎咨询。关于短信验证码EditText,它通常是在用户注册或登录时需要验证用户身份时使用的。在使用过程中,通常会在EditText中输入收到的短信验证码,并通过验证后完成相应的操作。这种验证方式可以增加系统的安全性和用户的信任感。如果您有相关的技术问题或需要更详细的信息,请提供更具体的问题。 ### 回答2: 短信验证码EditText是一种常见的输入框,用于用户在手机应用程序中输入接收到的短信验证码。它通常用于验证用户的身份,例如在注册新账户、修改密码或进行一些敏感操作时。 短信验证码EditText通常以一个输入框的形式呈现,用户需要将收到的验证码粘贴或手动输入到输入框中。在设计该控件时,通常会限制输入字符的类型和长度,以确保用户只能输入数字验证码。 为了方便用户看到已经输入的验证码,短信验证码EditText通常会显示一个光标,指示用户当前正在输入的位置。此外,为了增强用户体验,该控件还可以自动弹出数字键盘,简化输入过程。 在使用短信验证码EditText时,开发者需要通过代码来实现验证码的验证功能。通常,应用程序会使用一些算法或服务来验证用户输入的验证码是否正确。一旦验证通过,用户就可以继续进行下一步操作。 总之,短信验证码EditText是一个重要的用户输入控件,提供了一种安全验证用户身份的方式。它的设计考虑了用户体验和安全性,帮助用户更方便地完成验证过程,保障应用程序和用户的安全。 ### 回答3: 短信验证码EditText是一个输入框,用于接收短信验证码的文本信息。当我们在使用某些需要验证身份的应用或网站时,通常会收到一条包含数字的短信验证码。然后我们需要将这个验证码输入到相应的输入框中,以完成身份验证。 这个短信验证码EditText通常具有以下特征和功能: 1. 输入文本框:这个EditText提供一个可编辑的文本框,用户可以在其中输入接收到的短信验证码。通常,这个文本框会有一些限制条件,例如限定只能输入数字,限制输入长度等。 2. 验证功能:当我们输入完短信验证码后,应用或网站会进行相关的验证,以确认我们输入的验证码是否正确。一般来说,验证会在我们点击验证按钮或者输入完成后自动触发。 3. 提示信息:为了帮助用户更好地输入验证码,短信验证码EditText通常会提供一些提示信息。例如,可能会提示用户输入短信中的数字验证码,或者告知用户输入错误时的错误提示信息。 4. 自动填充:为了方便用户输入,一些应用或网站会提供自动填充的功能。这意味着当用户收到短信验证码时,EditText会自动将验证码填充到输入框中,用户只需点击确认即可。 总的来说,短信验证码EditText提供了一个方便用户输入短信验证码的界面,并通过验证功能验证用户输入的验证码是否正确。它是应用或网站中进行身份验证的重要组成部分,帮助确保用户身份的安全性和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值