EditText方框验证码

本文介绍了一种验证码输入框的设计方案,通过使用EditText与TextView结合的方式实现动态改变颜色的效果。该方案能够有效提升用户体验,同时提供了输入完成及删除键的监听功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果图

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



思路:

 1.用一个透明的EditText与四个TextView重叠,并给TextView设置默认背景

 2.监听EditText文本变化,获取输入内容,给TextView赋值并改变TextView背景

 3. 4TextView有值后添加输入完成回调,监听删除键添加删除回调

代码:

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, AttributeSetattrs) {

    this(context,attrs, 0);

}

 

public SecurityCodeView(Context context, AttributeSetattrs, int defStyleAttr) {

    super(context,attrs, defStyleAttr);

    TextViews = newTextView[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 voidbeforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

 

        }

 

        @Override

        public voidonTextChanged(CharSequence charSequence, int i, int i1, int i2) {

 

        }

 

        @Override

        public voidafterTextChanged(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) {

                       //文字长度位则调用完成输入的监听

                       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 booleanonKey(View v, int keyCode, KeyEvent event) {

            if(keyCode == KeyEvent.KEYCODE_DEL

                   && event.getAction() == KeyEvent.ACTION_DOWN) {

                if(onKeyDelete()) return true;

                returntrue;

            }

            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(InputCompleteListenerinputCompleteListener) {

    this.inputCompleteListener= inputCompleteListener;

}

 

public interface InputCompleteListener {

    void inputComplete();

 

    void deleteContent(booleanisDelete);

}

 

/**

 * 获取输入文本

 *

 * @return

 */

public String getEditContent() {

    returninputContent;

}

布局

  <?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">

 

<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 MainActivityextends AppCompatActivity implements SecurityCodeView.InputCompleteListener {

 

    privateSecurityCodeView editText;

    privateTextView text;

 

    @Override

    protected void onCreate(BundlesavedInstanceState) {

    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(booleanisDelete) {

        if(isDelete){

       text.setText("输入验证码表示同意《用户协议》");

       text.setTextColor(Color.BLACK);

      }

  }

}

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

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值