支付的密码输入框

本文介绍了一种在Android应用中实现密码输入框的方法。通过使用EditText和ImageView数组,结合StringBuffer来存储输入的密码字符,并利用自定义监听器实现密码输入的动态显示效果。文章详细解释了如何限制密码长度并响应软键盘的删除操作。

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

Android密码的输入框

原理

图片的覆盖

之前有一个正方形的框子 点击后变成了黑点

private EditText editText;
private ImageView[] imageViews;//使用一个数组存储密码框
private StringBuffer stringBuffer = new StringBuffer();//存储密码字符
private int count = 6;
private String strPassword;//密码字符串

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

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

public ItemPasswordLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    imageViews = new ImageView[6];
    View view = View.inflate(context, R.layout.edittext_input_view, this);

    editText = (EditText) findViewById(R.id.item_edittext);
    imageViews[0] = (ImageView) findViewById(R.id.item_password_iv1);
    imageViews[1] = (ImageView) findViewById(R.id.item_password_iv2);
    imageViews[2] = (ImageView) findViewById(R.id.item_password_iv3);
    imageViews[3] = (ImageView) findViewById(R.id.item_password_iv4);
    imageViews[4] = (ImageView) findViewById(R.id.item_password_iv5);
    imageViews[5] = (ImageView) findViewById(R.id.item_password_iv6);

    editText.setCursorVisible(false);//将光标隐藏
    editText.setInputType(InputType.TYPE_CLASS_NUMBER);
    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() > 5) {
                    //当密码长度大于5位时edittext置空
                    editText.setText("");
                    return;
                } else {
                    //将文字添加到StringBuffer中
                    stringBuffer.append(editable);
                    editText.setText("");//添加后将EditText置空  造成没有文字输入的错局
                    count = stringBuffer.length();//记录stringbuffer的长度
                    strPassword = stringBuffer.toString();
                    if (stringBuffer.length() == 6) {
                        //文字长度位6   则调用完成输入的监听
                        if (inputCompleteListener != null) {
                            inputCompleteListener.inputComplete();
                        }
                    }
                }

                for (int i = 0; i < stringBuffer.length(); i++) {
                    imageViews[i].setImageResource(R.mipmap.ispassword);
                }
            }
        }
    });
    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 = 6;
        return true;
    }
    if (stringBuffer.length() > 0) {
        //删除相应位置的字符
        stringBuffer.delete((count - 1), count);
        count--;
        strPassword = stringBuffer.toString();
        imageViews[strPassword.length()].setImageResource(R.mipmap.nopassword);

    }
    return false;
}


private InputCompleteListener inputCompleteListener;

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


//外部调用监听的方法
public interface InputCompleteListener {
    void inputComplete();
}

public EditText getEditText() {
    return editText;
}

/**
 * 获取密码
 *
 * @return
 */
public String getStrPassword() {
    return strPassword;
}

public void setContent(String content) {
    editText.setText(content);
}

源码  https://github.com/letuszou/InputPasswordEdittext

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值